首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

这样的struct能占内存多少字节?求大牛!该如何处理

2012-04-22 
这样的struct能占内存多少字节??求大牛!废话不说,直接上代码:C/C++ codestruct A{A()~A()int m1int m2

这样的struct能占内存多少字节??求大牛!
废话不说,直接上代码:

C/C++ code
struct A  {      A();      ~A();      int m1;      int m2;  }a;  struct B  {      B();      ~B();      int m1      char m2;      static char m3;  }b;  struct C  {      C();      virtual ~C();      int m1;      int m2;  }c;  


结果是这样的:sizeof(a)=8 sizeof(b)=8 sizeof(c)=12
不知道为什么是这样?virtual函数还能占大小???求大虾解释。


[解决办法]
virtual
会有个虚拟列表,会多出个指向虚拟列表的指针,一个指针4个字节
[解决办法]
拥有virtual函数的类中,需要维护一个虚函数表的指针,一个指针的大小是4字节,所以~~~
[解决办法]
a 4+4 = 8
b static不占用空间 4+1+3(补齐) = 8
c vptr占用4个字节
[解决办法]
我重新说明下:
1.对于A 大小为8 显然,两个int型各占4个byte
2.对于B 大小为8 一个整型4byte,一个字符型1byte,static 变量存放在程序的data segment中,和对象实体大小无关。还有一个所谓的allignment限制,也就是边界调整,对于32位的机器,调整位4byte的整数倍,主要是为了提升数据的访问速度。所以再填补3byte ,总过8byte.
3.对于C 先看下它的对象模型
_vptr ---->指向虚函数表的指针 用于virtual机制。 4byte
int m1 ---- 4byte
int m2 -----4byte
其中,_vptr的位置并不固定,vc编译器在首部,其他编译器可能在尾部。
建议楼主看下 inside c++ object model ,里面Data语意学 有详细介绍。


[解决办法]
探讨

引用:

a 4+4 = 8
b static不占用空间 4+1+3(补齐) = 8
c vptr占用4个字节

这个补齐是啥意思?为啥要这样的,char 就占一个字节不行吗?

[解决办法]
C类里边有个指向虚函数表的指针,所以多了四个字节

热点排行