目录
类对象所占用的空间
visual studio 操作
- F9 设置断点
- F5 执行调试 运行程序至断点
- Shift + F5 停止调试
- Ctrl + F5 执行不调试
- Shift + F9 快速监视,查看变量内存信息
- 在弹出框表达式的变量前加 & 查看地址
- 查看变量内存(在调试状态下才有该选项)
类对象所占用的空间解析
为什么sizeof(空类)= 1而不是0
- 代码
class A { public: }; int main() { A a; int a_len = sizeof(a); //等价于sizeof(A) std::cout << a_len << std::endl; // 输出 1 return 0; }
- 按F5 ,选择对象a,Shift +F9进行查看
- 将上述对象a地址,复制到内存查询中,如下:
- 为什么sizeof(空类)= 1而不是0?
- 即便是一个空类对象,这个类的对象在内存中有起始地址的,这个地址是属于对象a,必然至少要存得下一个字节
类的成员函数 不占用 类对象的内存空间
在空类中加入成员函数:
class A { public: void func1() {}; void func2() {}; void func3() {}; }; int main() { A a; int a_len = sizeof(a); //等价于sizeof(A) std::cout << a_len << std::endl; // 输出 1 return 0; }
- 运行结果依旧是1
增加 char 类型的成员变量
- 由前面两个案例可知:
- 成员函数不占用类对象的内存空间
- 一个类对象至少占用1个字节的内存空间
class A { public: void func1() {}; void func2() {}; void func3() {}; char ac; //成员变量,占一个字节 }; int main() { A a; int a_len = sizeof(a); std::cout << a_len << std::endl; // 输出 1 a.ac = 'c', return 0; }
- 输出为 1;
- 分析:
- 查看对象a的地址
- 赋值前
- 赋值后
- 结论:成员变量是占用对象的内存空间的
增加 int 类型的成员变量
class A { public: void func1() {}; void func2() {}; void func3() {}; int ac; //成员变量,占4个字节 }; int main() { A a; int a_len = sizeof(a); std::cout << a_len << std::endl; a.ac = 'c'; return 0; }
- 分析
- 赋值后
结论
- 成员变量是包含在每个对象中的,是占用对象字节的。
- 成员函数虽然也写在类的定义中,但成员函数不占对象字节数的(不占内存空间)
- 成员函数 每个类只诞生 一个(跟着类走),而不管你用这个类产生了多少个该类的对象
(C++对象模型):类对象所占用的空间
最新推荐文章于 2023-10-20 17:49:00 发布