有虚函数的类所占内存大小

来源:互联网 发布:企业信息化软件需求 编辑:程序博客网 时间:2024/05/22 00:18
#include <iostream> using namespace std; class A   {   };  class B   {char ch;   virtual void func0()  {  } }; class C  {char ch1;char ch2;virtual void func()  {  }  virtual void func1()  {  } };class D: public A, public C{   int d;   virtual void func()  {  } virtual void func1()  {  }};   class E: public B, public C{   int e;   virtual void func0()  {  } virtual void func1()  {  }};int main(void){cout<<"A="<<sizeof(A)<<endl;    //result=1cout<<"B="<<sizeof(B)<<endl;    //result=8    cout<<"C="<<sizeof(C)<<endl;    //result=8cout<<"D="<<sizeof(D)<<endl;    //result=12cout<<"E="<<sizeof(E)<<endl;    //result=20getchar();return 0;}

结果:

DEV C++:

VC60:


#include <iostream> using namespace std; class CommonBase{int co;};class Base1: virtual public CommonBase{public:virtual void print1() {  }virtual void print2() {  }private:int b1;};class Base2: virtual public CommonBase{public:virtual void dump1() {  }virtual void dump2() {  }private:int b2;};class Derived: public Base1, public Base2//有两个带有虚函数的基类,虚指针所占大小为4*2(是一个vptr还是2个vptr呢????) {public:void print2() {  }void dump2() {  }private:int d;};int main(){    cout<<sizeof(Base1)<<endl;//12    cout<<sizeof(Base2)<<endl;//12    cout<<sizeof(Derived)<<endl;//24 如果Base1和Base2不是虚继承,则Common Base会补被当做两份不同的拷贝。从而sizeof(Derived)变成28.     getchar();    return 0;}

结果:

devc++:

VC60:


#include <iostream> using namespace std; class A{public:virtual void aa() {  }virtual void aa2() {  }private:char ch[3];};class B: virtual public A{public:virtual void bb() {  }virtual void bb2() {  }};int main(void){cout<<"A's size is "<<sizeof(A)<<endl;//8cout<<"B's size is "<<sizeof(B)<<endl;//12getchar();return 0;}


VC60:


参考:

C++中虚函数工作原理和(虚)继承类的内存占用大小计算

C++ 虚函数表解析

深入理解C++的动态绑定和静态绑定

C++对象大小讨论

C++对象大小讨论

对比补充例子:

#include<iostream>using namespace std;class B{      public:             virtual void fm()             {}};class D:public B{      public:             virtual void fm()             {}};int main(){    cout<<sizeof(B)<<endl;    cout<<sizeof(D)<<endl;    getchar();}
DevC++下:

VC60下:


#include<iostream>using namespace std;class B{      public:             virtual void fm()             {}};class D:public B{      public:             virtual void ft()             {}};int main(){    cout<<sizeof(B)<<endl;    cout<<sizeof(D)<<endl;    getchar();}

DEVC++:

VC60:

#include<iostream>using namespace std;class B{      public:             virtual void fm()             {}};class D:virtual public B{      public:             virtual void fm()             {}};int main(){    cout<<sizeof(B)<<endl;    cout<<sizeof(D)<<endl;    getchar();}
DEVC++:

VC60:

#include<iostream>using namespace std;class B{      public:             virtual void fm()             {}};class D:virtual public B{      public:             virtual void ft()             {}};int main(){    cout<<sizeof(B)<<endl;    cout<<sizeof(D)<<endl;    getchar();}
DEVC++:

VC60:






原创粉丝点击