首先重新回顾一下关于类/对象大小的计算原则:
类的大小与静态数据成员无关
虚继承对类的大小的影响
虚函数对类的大小的影响
类大小计算遵循结构体对齐原则
第一个数据成员放在offset为0的位置
其它成员对齐至min(sizeof(member),#pragma pack(n)所指定的值)的整数倍。
整个结构体也要对齐,结构体总大小对齐至各个min中最大值的整数倍。
win32 可选的有1, 2, 4, 8, 16
linux 32 可选的有1, 2, 4
类的大小与数据成员有关与成员函数无关类的大小与静态数据成员无关
虚继承对类的大小的影响
虚函数对类的大小的影响
下面通过实例来展示虚继承和虚函数对类大小造成的影响。
测试环境为:Win32 + Vs2008
一、只出现虚继承的情况
C++ Code
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
#include <iostream>
using namespace std; class BB { public : int bb_ ; }; class B1 : virtual public BB { public : int b1_ ; }; class B2 : virtual public BB { public : int b2_ ; }; class DD : public B1, public B2 { public : int dd_ ; }; int main ( void) { cout<< sizeof (BB)<< endl; cout<< sizeof (B1)<< endl; cout<< sizeof (DD)<< endl; B1 b1 ; int** p ; cout<<&b1 <<endl; cout<<&b1 .bb_<< endl; cout<<&b1 .b1_<< endl; p = ( int **)&b1; cout<<p [ 0][ 0]<<endl; cout<<p [ 0][ 1]<<endl; DD dd ; cout<<&dd <<endl; cout<<&dd .bb_<< endl; cout<<&dd .b1_<< endl; cout<<&dd .b2_<< endl; cout<<&dd .dd_<< endl; p = ( int **)ⅆ cout<<p [ 0][ 0]<<endl; cout<<p [ 0][ 1]<<endl; cout<<endl ; cout<<p [ 2][ 0]<<endl; cout<<p [ 2][ 1]<<endl; |