C++类的大小是怎样计算的本人在不久前的面试中,遇到求C++类大小的笔试题,该类有几个成员变量和函数.我将成员变量的字节数的总和加1作为类的大小,结果当然错误,工作当然也没得到.面试失败后,我上机测试了几个类的大小(如下所示),没有找出其中的规律.虽然C++类的大小是多少对编程并没影响(本人是这样认为的),但既然遇到了这个问题,就应该把它搞懂,是不是?所以向各位高手请教,拜托!classA{public:inti;};classB{public:charch;};classC{public:inti;shortj;};classD{public:inti;shortj;charch;};classE{public:inti;intii;shortj;charch;charchr;};classF{public:inti;intii;intiii;shortj;charch;charchr};个类大小如下:sizeof(A)=4;sizeof(B)=1;sizeof(c)=8;sizeof(d)=8;sizeof(E)=12;sizeof(F)=20;请问C++类的大小是怎样计算的?其成员函数的大小又怎样计算?classaaaa{..............}aaaa*pA=newaaaa;sizeof(pA)=4;看过侯sir的深入探索c++对象模型吗?上面有,但是我只看懂一点。其实主要在你上边所有的类,他们最后的大小都要被编译器扩充到4的倍数,所以就得到了这样的结果。其他的我在好好研究一下。哈哈。同一楼上,类中的成员要按字为单位即4字节来储存,所以不足4字节成员如不能与其它不足4字节成员组合成4字节,则要补齐若干字节按4字节排列,以便分界。其实知道了这个规则还是很有用的,可以优化成员的排列来节省空间。这也就是说即使成员完全相同但排列不同计算出的类的大小也可能完全不同。如下例:一个类的大小可以被下面的方式改变:classA{boola;intb;boolc;};//sizeof(A)==12在我的电脑上sizeof(A)等于12。这个结果可能会让你吃惊,因为A的成员总数是6个字节:1+4+1个字节。那另6字节是哪儿来的?编译器在每个bool成员后面都插入了3个填充字节以保证每个成员都是按4字节排列,以便分界。你可以减少A的大小,通过以下方式:classB{boola;boolc;intb;};//sizeof(B)==8这一次,编译器只在成员c后插入了2个字节。因为b占了4个字节,所以就很自然地把它当作一个字的形式排列,而a和c的大小1+1=2,再加上2个字节就刚好按两个字的形式排列B。同志们,C++中类的成员函数,静态成员是不占类的大小的。类的大小等于基类的大小+子类个non-static成员变量的大小,这里成员变量是会被字节对齐的。就像楼上所说的那样。如果有虚函数,类的大小+4个字节。(用来存放vptr)如果是虚继承,虚基类的大小不算了,但是要算4个字节(用来存放指向虚基对象的指针)综上所述:classA{virtualvoidfoo();inti;charc;};sizeof(A)=12=vptr+sizeof(i)+(sizeof(c)+3);classB:publicA{voidfoo1();staticinthaha;longll;}sizeof(B)=16=sizeof(A)+sizeof(ll);classC:virtualpubilcA{charsz[10];}sizeof(C)=20=vptr+vbtr+sizeof(sz)+2;这样写,不知道明不明白楼上的xiaoyunet基本说对了,但是最后的classC应该是vptr+pointer+char*sz+sizeof(A)其中的pointer是C中指向A的指针以实现virtualbase。charsz[10]实际上是个char*类型的指针,4byte。toybearcn说的也不错,字节对齐和计算机体系结构有关,是硬件的需要。但sdj163的看法是错误的,成员函数与类大小没有关系,只与类型信息有关。而且,运行的程序由对象组成,不是类,就算是对象,它的大小也与成员函数无关。我再VC7上市了一下,发现一个有趣的问题。classA{charaa[10];};sizeof(A)=10!!!!!!!classA{inti;charaa[10];}sizeof(A)=16//这个值还差不多上面的朋友说charsz[10],只char类型的指针?请问,这个东西在那里分配,谁来分配?我来告诉这位朋友,sz是在堆栈上分配的。所以绝对不会只是一个指针。但是,谁能回答我第一个例子中sizeof(A)竟然会等于10。这我就搞不懂了。不要把“4字节对齐”当成bible,编译器的实现是不同的,比如VC就会做出一些优化措施。考虑一下一个空类,它的大小是1字节而不是4字节。再如前面的例子,C的大小好像应该是30,但确是28(VC6)。可以看出,VC对char的安排无须4字节对齐,char[10]的10个字节,2个4字节,还有两个应该填充在A的charc后。所以A的大小为10没什么奇怪,VC比较喜欢“优化”这一类的技术细节但是在vc中我的调试结果却让我有陷入了困境。程序是这样的:#includeiostream.hclassaa{boolaa1;charaaa[10];charaa2[2];};voidmain(){coutsizeof(aa);}输出的结果是13。按照上面介绍的算法应该是:4+10+4=18呀,为什么是12呢?请高手指点。关于对象模型,楼上各位已经说了很多,建议你找一本《深入C++对象模型》。我在这补充几点:1。类大小在C++标准里没有具体规定,而是由编译器来决定。所以,类的真实大小根平台和编译器有关;2。一般编译器都会用allignment(一般译作“对齐”);3。一般成员函数不会影响类大小。我觉得VC里的数据对齐似乎对数组是不起作用的。比如:classC{public:boolb1;charc1[10];shorti2;charc2[2];};这里sizeof(C)是16,也就是short和bool对齐。分别是2字节。如果把shorti2去掉,则sizeof(C)是13,bool值占一个字节。如果把shorti2换成inti2,则结果是20。bool值占4个字节了。classD{public:inti;shortj;charch;charm;};这时候好像没对齐,sizeof(D)=4+2+1+1=8而改为classD{public:inti;shortj;charch;charm;charf;};sizeof(D)=12,进行了对齐,不知道怎么对齐的4字节的要在4倍地址开始;2字节的要在2倍地址开始;而1字节可以在1倍地址(既任意地址)开始。所以:charch;shortsh;是这样的:|--------|--------|--------|--------||charch|null|shortsh|short;char;char:|--------|--------|--------|--------||short|char|char|bool是1字节,那么可以当char看。与定义的顺序、操作系统、编译器有关32位机下:boolb1;boolb2;intn;//长8boolb1;intn;boolb2//长12编译器为提高速度,将变量对齐到偶地址(或许不准确,这是16位里的说法),将不足长的地方自动填充几个字节凑足整长对于空类sizeof一般是1一般来说,一个空类的大小为1,即c++不允许有0大小的类存在。这主要是为了保证类对象可以被寻址但是,一个类继承了一个空类,并不代表这个类的大小会增大,因为一般现在的编译器都有一个“空白基础类别最佳化技术”,它可以使空基类在继承类中大小为0;至于类的大小计算,就是将类成员变量大小相加,再加上非虚基类大小,如果有多态性还要考虑vptr(可能不止一个)大小“成员函数与类大小没有关系。”magicblue(小飞侠)是对的,即使是virtualfunction也不要求类或对象多4bytes。但是《insidec++objectmodal》中说即使non-virtualfunction也会有一个pointer指向它,为何类或对象都反应不出这个大小呢?