zz: C++类中的对象在内存中的存放方式
来源:互联网 发布:淘宝同款怎么去掉 编辑:程序博客网 时间:2024/06/16 16:19
http://blog.csdn.net/zhangliang_218/archive/2010/04/30/5544802.aspx
zz: http://www.cppblog.com/aa19870406/archive/2011/06/01/147889.html
一直不明白c++中类中的函数和成员变量在实例化对象后在内存中究竟是个什么样的布局。一度以为一个对象的内存布局应该包括函数体和成员变量,后来才知道对象的内存布局是不包括函数体的。也就是说实例化一个类后,该对象占用的内存空间大小实际上是它的成员变量在内存中所占用空间大小(注意,含有静态成员变量和虚函数的类对象例外)。以下分析以下c++类对象在内存中的布局,并且探讨在给定一个类的成员变量的类型和数量时,如何使得类实例化后对象所占用的内存空间最小(考虑变量在内存中对齐)。
先给出一个类,如下:
2 {
3 public:
4 A()
5 {
6 cout << "A" << endl;
7 }
8 virtual ~A()
9 {
10 cout << "~A" << endl;
11 }
12 virtual void printA()
13 {
14 cout << "printA" << endl;
15 }
16 private:
17
18 int a;
19 char c;
20 char e;
21 double b;
22 static double d;
23 };
24
25 int main()
26 {
27
28 A a;
29 cout << sizeof(a) << endl; //输出是24
30 return 0;
31 }
以上代码输出是:24。也就是说对象a占用内存空间大小是24字节,这个24字节是怎么得来的呢?我们注意到在类A中存在虚函数,而只有类中有虚函数存在,则可以知道,在每个类对象占用内存空间的首部都会有一个虚函数表,这个虚函数表可以看成是一个指针数组,在对象a中虚函数表中总共有2项,因为类A中存在两个虚函数,每个虚函数都在虚函数表中有一个项对应。现在我们知道虚函数表是2个指针的内存大小,所以是2*4=8字节。然后a,c,e总共占用4+1+1=6字节,由于需要进行内存对齐,所以实际上它占用的大小是8字节(即类对象中的内存按照占用内存空间最大的变量来对齐,static变量不考虑在内)。然后是b占用8字节,static变量d不占用空间,综上对象a占用空间大小为8(虚函数表)+8(a,c,e)+8(b)=24字节。具体可以在vs下调试,查看a的地址。
- zz: C++类中的对象在内存中的存放方式
- C++类中的对象在内存中的存放方式
- C++类中的对象在内存中的存放方式
- C++类中的对象在内存中的存放方式
- C++对象在内存中的存放方式
- 类在内存中的存放
- float在内存中的存放方式
- 浮点数在内存中的存放方式
- 二进制在内存中的存放方式
- 程序在内存中的存放
- bmp在内存中的存放
- 变量在内存中的存放
- 数据在内存中的存放
- 数据在内存中的存放
- 浮点型在内存中的存放方式问题
- OC基础-类对象在内存中的存储方式13
- [C++]内置类型变量在内存中的存放
- c中的变量在内存中存放的位置
- 创业团队的那些事
- 如何定一个合适的目标
- c/c++编译器的内存分配模式 zz: http://blog.csdn.net/gukesdo/archive/2011/06/16/6548256.aspx
- OracleDBConsoleorcl无法启动
- 标题中的关键字变红
- zz: C++类中的对象在内存中的存放方式
- 教你如何用Camera作为你view的背景
- SWING 把菜单放到苹果的菜单栏,并自定义软件名 About
- 35岁之前要做的十件事
- 解决:System.Data.SqlClient.SqlException: 超出了存储过程、函数、触发器或视图的最大嵌套层数(最大层数为 32).
- FCK上传word 2007(.docx)文件
- html文本框按回车相当于点击某个按钮
- IT职业规划
- 一些Linux系统服务调优/问题定位技巧