- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C类的大小是怎样计算的
C++类的大小是怎样计算的
本人在不久前的面试中,遇到求C++类大小的笔试题,该类有几个成员变量和函数.我将成员变量的字节数的总和加1作为类的大小,结果当然错误,工作当然也没得到.
面试失败后,我上机测试了几个类的大小(如下所示),没有找出其中的规律.虽然C++类的大小是多少对编程并没影响(本人是这样认为的),但既然遇到了这个问题,就应该把它搞懂,是不是?所以向各位高手请教,拜托!
class A
{
public:
int i;
};
class B
{
public:
char ch;
};
class C
{
public:
int i;
short j;
};
class D
{
public:
int i;
short j;
char ch;
};
class E
{
public:
int i;
int ii;
short j;
char ch;
char chr;
};
class F
{
public:
int i;
int ii;
int iii;
short j;
char ch;
char chr
};
个类大小如下:
sizeof(A)=4;sizeof(B)=1;sizeof(c)=8;sizeof(d)=8;
sizeof(E)=12;sizeof(F)=20;
请问C++类的大小是怎样计算的?其成员函数的大小又怎样计算?
class aaaa
{
.......
.......
}
aaaa *pA = new aaaa ;
sizeof ( pA ) = 4 ;
看过侯sir的深入探索c++对象模型吗?上面有,但是我只看懂一点。
其实主要在你上边所有的类,他们最后的大小都要被编译器扩充到4的倍数,所以就得到了这样的结果。其他的我在好好研究一下。哈哈。
同一楼上,类中的成员要按字为单位即4字节来储存,所以不足4字节成员如不能与其它不足4字节成员组合成4字节,则要补齐若干字节按4字节排列,以便分界。其实知道了这个规则还是很有用的,可以优化成员的排列来节省空间。
这也就是说即使成员完全相同但排列不同计算出的类的大小也可能完全不同。
如下例:
一个类的大小可以被下面的方式改变:
class A
{
bool a;
int b;
bool c;
}; //sizeof (A) == 12
在我的电脑上sizeof (A) 等于12。这个结果可能会让你吃惊,因为A的成员总数是6个字节:1+4+1个字节。那另6字节是哪儿来的?编译器在每个bool成员后面都插入了3个填充字节以保证每个成员都是按4字节排列,以便分界。你可以减少A的大小,通过以下方式:
class B
{
bool a;
bool c;
int b;
}; // sizeof (B) == 8
这一次,编译器只在成员c后插入了2个字节。因为b占了4个字节,所以就很自然地把它当作一个字的形式排列,而a和c的大小1+1=2,再加上2个字节就刚好按两个字的形式排列B。
同志们,C++中类的成员函数,静态成员是不占类的大小的。
类的大小等于基类的大小+子类个non-static成员变量的大小,这里成员变量是会被字节对齐的。就像楼上所说的那样。
如果有虚函数,类的大小+4个字节。(用来存放vptr)
如果是虚继承,虚基类的大小不算了,但是要算4个字节(用来存放指向虚基对象的指针)
综上所述:
class A
{
virtual void foo();
int i;
char c;
}; sizeof(A) = 12 = vptr + sizeof(i) + (sizeof(c) +3);
class B :public A
{
void foo1();
static int haha;
long ll;
} sizeof(B) = 16 = sizeof(A) + sizeof(ll);
class C : virtual pubilc A
{
char sz[10];
} sizeof(C) = 20 = vptr + vbtr + sizeof(sz) +2;
这样写,不知道明不明白
楼上的xiaoyunet基本说对了,但是最后的class C应该是vptr + pointer +
char* sz + sizeof(A)
其中的pointer是C中指向A的指针以实现virtual base。char sz[10]实际上是个char*类型的指针,4byte。
toyb
文档评论(0)