首页新闻找找看学习计划

类中各种sizeof问题

0
[待解决问题]

下面是各种类中的sizeof问题,纯属好奇,求解答,涉及虚函数、虚继承、数据对齐问题;

其实还有好多不解的问题,先列以下这几种吧,求高手解答~~~

View Code
 1 #include<iostream>
 2 using namespace std;
 3 class a{virtual void f(){}    double av;int ab;
 4 //virtual void f1(){}
 5 };
 6 class b{//int  aa;int aad;
 7     //virtual void f1(){}
 8 };
 9 class c{//int aad
10     ;};
11 class d{int aad;
12 };
13 class e:public virtual a//,public virtual bublic virtual c,public virtual d
14 {};
15 void main()
16 {cout<<sizeof(e)<<endl;} 

输出是32;

 

View Code
 1 #include<iostream>
 2 using namespace std;
 3 class a{virtual void f(){}    double av;int ab;
 4 //virtual void f1(){}
 5 };
 6 class b{//int  aa;int aad;
 7     //virtual void f1(){}
 8 };
 9 class c{//int aad
10     ;};
11 class d{int aad;
12 };
13 class e:public virtual a,public virtual b,public virtual c//,public virtual d
14 {};
15 void main()
16 {cout<<sizeof(e)<<endl;} 

 

输出是 36;

 

View Code
 1 #include<iostream>
 2 using namespace std;
 3 class a{virtual void f(){}    double av;int ab;
 4 //virtual void f1(){}
 5 };
 6 class b{//int  aa;int aad;
 7     virtual void f1(){}
 8 };
 9 class c{//int aad
10     ;};
11 class d{int aad;
12 };
13 class e:public virtual a,public virtual b,public virtual c//,public virtual d
14 {};
15 void main()
16 {cout<<sizeof(e)<<endl;} 


输出是36;

 

View Code
 1 #include<iostream>
 2 using namespace std;
 3 class a{virtual void f(){}    double av;int ab;
 4 //virtual void f1(){}
 5 };
 6 class b{int  aa;int aad;
 7     virtual void f1(){}
 8 };
 9 class c{//int aad
10     ;};
11 class d{int aad;
12 };
13 class e:public virtual a,public virtual b,public virtual c//,public virtual d
14 {};
15 void main()
16 {cout<<sizeof(e)<<endl;} 


输出是44;

 

View Code
 1 #include<iostream>
 2 using namespace std;
 3 class a{virtual void f(){}    double av;int ab;
 4 //virtual void f1(){}
 5 };
 6 class b{int  aa;int aad;
 7     virtual void f1(){}
 8 };
 9 class c{//int aad;
10     virtual void f2(){}
11 };
12 class d{//int aad;
13 };
14 class e:public virtual a,public virtual b,public virtual c,public virtual d
15 {};
16 void main()
17 {cout<<sizeof(e)<<endl;} 

输出是48;

C++
月流霜的主页 月流霜 | 菜鸟二级 | 园豆:202
提问于:2012-10-09 21:27
< >
分享
所有回答(2)
0

http://www.cnblogs.com/review/archive/2012/10/10/2718299.html

睿酷 | 园豆:211 (菜鸟二级) | 2012-10-17 12:38

你说的我都知道,可是涉及到数据对齐的时候就都不能理解了,你能不能稍微解释下我写的代码啊~~~

支持(0) 反对(0) 月流霜 | 园豆:202 (菜鸟二级) | 2012-10-17 13:05

@月流霜:

例如第一题:

class a中虚函数表指针4字节从第0字节(4倍数)开始放第3字节;
double型8字节,需要8字节对齐,从第8字节(8的倍数)放到第15字节;
int型4byte需要4字节对齐,从16字节(4的倍数)放到19字节;这样class a中数据占用了20byte;
class a本身再根据其中最大的数据类型(double型)对齐,即8字节对齐,所以class a额外占用4字节,为24字节。

class e从class a虚继承,所以有虚基表4字节,从第0字节放到第3字节;
class a 24字节,从第8字节放到第31字节;共32字节。

支持(0) 反对(0) 睿酷 | 园豆:211 (菜鸟二级) | 2012-10-19 10:13

@睿酷: class e从class a虚继承,所以有虚基表4字节,从第0字节放到第3字节;
class a 24字节,从第8字节放到第31字节;共32字节。

为什么class a 24字节不是从4字节开始放而是从8开始呢,难道虚基表也要数据对齐?

支持(0) 反对(0) 月流霜 | 园豆:202 (菜鸟二级) | 2012-10-19 12:56
0

这一系列代码只有第一题可以用数据对齐和虚继承虚函数来解释下,往后就没法解释了(对我来说)

昨晚还特意翻了下《深度探索C++对象模型》,里面讲了继承虚拟函数、多重继承虚拟函数和虚拟继承虚拟函数

但是没讲多重虚拟继承虚拟函数...也许是难度太大,作者认为不适合讨论...

另外我还试了下同时虚拟继承8个空类,然后依次往里面加一个虚函数并观察size,更诡异的事情出现了

有时往基类里添加一个虚函数后,继承类的size反而变小了...

至此,决定放弃了...

花无形 | 园豆:279 (菜鸟二级) | 2012-10-19 12:46
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册