}; //A的自身对齐值是double s的自身对齐值,为8 //但A的有效对齐值是min(8,2)=2,sizeof(A)=12 class B { public: char c; //自身对齐值1,占1字节 A b; //自身对齐值8,占sizeof(A)=12字节 }; //B的自身对齐值等于A的自身对齐值,为8 //B的有效对齐值=min(8,2)=2,按2字节对齐 sizeof(B)=14 //char c占1字节,储存在0x00,0x01空出;A b占12字节。一共14字节。 四、结构体中含有虚函数的sizeof带有虚函数的结构体会有一个虚表指针,占4字节大小。例子: #pragma pack(4) Class A { public: int a; virtual int test(); }; sizeof(A)=8 //int a占4字节,虚表指针占4字节,一共8字节。 //注意:如果一个结构体有多个虚函数,也还是只有一个虚表指针,即多个虚函数共用一个虚表指针 对于继承的情况,如果基类有虚函数,那么这个虚表指针也会被继承下来,即基类和派生类共用一个虚表指针。例子: #pragma pack(4) class A { public: int a; double s; virtual int test(); }; class B:public A { public: virtual int test_1(); //共用基类虚表指针 virtual int test_2(); //共用基类虚表指针 char c;
}; sizeof(B)=20 //int a占4字节+double s占8字节+虚表指针占4字节+char c占1字节+3字节补齐对齐=20字节 五、联合体的sizeof联合体中各成员共享内存,整个联合体的sizeof就是每个成员sizeof的最大值。例子: union u { int a; double b; char c; bool d; }; sizeof(u)=sizeof(b)=8 六、含有static的结构体的sizeofstatic和全局变量都是储存在静态存储区,计算结构体的sizeof时只计算非static成员。例子: #pragma pack(4) class A { public: int a; double b; static int d; //不管他