下面是各种类中的sizeof问题,纯属好奇,求解答,涉及虚函数、虚继承、数据对齐问题;
其实还有好多不解的问题,先列以下这几种吧,求高手解答~~~
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;
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;
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;
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;
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;
http://www.cnblogs.com/review/archive/2012/10/10/2718299.html
你说的我都知道,可是涉及到数据对齐的时候就都不能理解了,你能不能稍微解释下我写的代码啊~~~
@月流霜:
例如第一题:
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字节。
@睿酷: class e从class a虚继承,所以有虚基表4字节,从第0字节放到第3字节;
class a 24字节,从第8字节放到第31字节;共32字节。
为什么class a 24字节不是从4字节开始放而是从8开始呢,难道虚基表也要数据对齐?
这一系列代码只有第一题可以用数据对齐和虚继承虚函数来解释下,往后就没法解释了(对我来说)
昨晚还特意翻了下《深度探索C++对象模型》,里面讲了继承虚拟函数、多重继承虚拟函数和虚拟继承虚拟函数
但是没讲多重虚拟继承虚拟函数...也许是难度太大,作者认为不适合讨论...
另外我还试了下同时虚拟继承8个空类,然后依次往里面加一个虚函数并观察size,更诡异的事情出现了
有时往基类里添加一个虚函数后,继承类的size反而变小了...
至此,决定放弃了...