首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【C++】面向对象模型 ② ( C++ 类对象的内存存储方式 | C 语言内存四区回顾 | C++ 类对象内存结构 | C++ 编译器将 C++ 类 转为 C 语言代码 分析 )

【C++】面向对象模型 ② ( C++ 类对象的内存存储方式 | C 语言内存四区回顾 | C++ 类对象内存结构 | C++ 编译器将 C++ 类 转为 C 语言代码 分析 )

作者头像
韩曙亮
发布2023-10-15 17:17:25
发布2023-10-15 17:17:25
1.4K0
举报

一、C++ 类对象的内存存储方式

1、C 语言内存四区回顾

操作系统 将 C 代码 分为

4

个区 , 由上到下 : 堆区 , 栈区 , 全局区 , 代码区 ;

  • 堆区 : 开发者负责分配释放内存 , 调用 malloc / new 函数分配内存 , 调用 free / delete 函数释放内存 , 如果程序结束还没有释放内存 , 则 由操作系统回收内存 ;
  • 栈区 : 由 编译器 自动 分配 与 释放 , 存放函数 参数 , 局部变量值 ;
  • 全局区 :
    • 静态区 : 存放 全局变量 , 静态变量 ; 初始化的 全局变量 和 静态变量 放在一块区域 , 未初始化的 全局变量 和 静态变量 放在另外一块区域 ; 程序执行结束后由操作系统释放 ;
    • 常量区 : 存放 字符串常量 和 其它常量 , 程序结束后由 操作系统释放 ;
  • 代码区 : 存放 函数的 二进制代码 ;

2、C++ 类对象内存结构

C++ 类对象内存结构 : C++ 类 实例对象 中的 成员变量 和 成员函数 在内存中是分开存储的 ;

  • 成员变量 :
    • 普通成员变量 : 在 对象 指针指向的内存中存储 , 存储方式与 C 语言中的 struct 结构体 存储变量的 内存结布局 和 字节对齐方式 相同 ;
    • 静态成员变量 : 在 内存 中的 全局数据区 中存储 ;
  • 成员函数 : 不管是 普通成员函数 还是 静态成员函数 , 都存储在 代码段 中 ;

C++ 面向对象 的底层 , 也是通过 C 语言实现的 ;

3、C++ 编译器将 C++ 类 转为 C 语言代码 分析

C++ 编译器 将 C++ 类 的 成员变量 和 成员函数 进行分开定义 ;

普通成员变量存储 :

对于 普通的 成员变量 , 存放在 结构体 中 ,

原来的 类名为 Test , 普通成员变量为 mI , C++ 编译器会将类转为 struct 结构体 , 然后将 普通成员变量 转为 结构体中的成员 ;

普通成员方法存储 :

Test 类中的成员函数 getI , 转为 C 语言后 , 方法名变为 类名_成员函数名 , 即 Test_getI ;

函数名 转换完毕后 , 还需要解决一个问题 , 多个对象都需要调用该 Test_getI 方法 , 此时将 第一个函数参数 , 类型为 Test* 类型 , 作为 对象的指针传入 ;

Test 类中的 getI 函数 , 最终转为了 Test_getI(Test* pThis) 函数 , 这是一个普通的 C 语言函数 ;

参数个数 : 将 C++ 类成员函数 转为 C 语言函数 后 , 对应的 C 语言函数 的第一个参数必须是 指定的类型指针参数 , 也就是说 , 假如 C++ 类成员函数有

n

个参数 , 那么 C++ 编译器将其转为的 C 语言函数就有

n + 1

个参数 ;

静态成员函数 : C++ 类中的 静态函数 转为 C 语言函数 ;

函数名 的 转换是一样的 , Test 类中的成员函数 Print , 转为 C 语言后 , 方法名变为 类名_成员函数名 , 即 Test_Print ;

静态成员函数 与 普通成员函数 的区别是 ,

  • 普通成员函数 转换后的 C 语言函数 , 第一个参数是 类对象指针 ;
  • 静态成员函数 转换后的 C 语言函数 , 没有 类对象指针参数 ;
  • 静态成员函数 与 转换后的 C 语言函数 , 参数列表是一样的 ;

成员函数调用 :

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-09-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、C++ 类对象的内存存储方式
    • 1、C 语言内存四区回顾
    • 2、C++ 类对象内存结构
    • 3、C++ 编译器将 C++ 类 转为 C 语言代码 分析
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档