源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

深入分析C++中类的大小

  • 时间:2021-05-08 06:41 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:深入分析C++中类的大小
[b]首先看一个例子: [/b]
[u]复制代码[/u] 代码如下:
#include <iostream>  using namespace std;  class A{};  class B  {      int b;      char c;  };  class C  {      int c1;         static int c2;  };  int C::c2 = 1;  class D:public C,public B{      int d;  };  int main()  {      cout<<"sizeof(A)="<<sizeof(A)<<endl;      cout<<"sizeof(B)="<<sizeof(B)<<endl;      cout<<"sizeof(C)="<<sizeof(C)<<endl;      cout<<"sizeof(D)="<<sizeof(D)<<endl;      return 0;  }
[b]运行结果为:[/b] [b]sizeof(A)=1[/b] [b]sizeof(B)=8[/b] [b]sizeof(C)=4[/b] [b]sizeof(D)=16[/b] 对于类A来说,虽然A是一个空类,但为了便于空类进行实例化,编译器往往会给它分配一个字节,这样A实例化后便在内存中有了一个独一无二的地址.对于类B,B的大小应为sizeof(int)+sizeof(char)=5,但是考虑内存对齐,B的大小应为8.对于类C,类的静态成员变量被放在全局区,和类的普通成员并没有放在一块。类的静态成员被声明后就已存在,而非静态成员只有类被实例化后才存在。所以C的大小为sizeof(int)=4。D的大小为B+C的大小+自身数据成员的大小,一共为16.   [b]==========================分割线在这里====================================[/b] 下面讨论含有虚函数的类的大小:
[u]复制代码[/u] 代码如下:
#include <iostream>  using namespace std;  class A  {  public:      void virtual aa(){};  };  class B:public A  {      void virtual bb(){};  };  class C:virtual A  {  public:      void virtual aa(){};      void cc(){};  };  class D:virtual A  {  public:      void virtual dd(){};  };  int main()  {      cout<<"sizeof(A)="<<sizeof(A)<<endl;      cout<<"sizeof(B)="<<sizeof(B)<<endl;      cout<<"sizeof(C)="<<sizeof(C)<<endl;      cout<<"sizeof(D)="<<sizeof(D)<<endl;      return 0;  }
[b]运行结果为:[/b] [b]sizeof(A)=4[/b] [b]sizeof(B)=4[/b] [b]sizeof(C)=8[/b] [b]sizeof(D)=12[/b] 对于class A,它含有一个虚函数,编译器会为虚函数生成一张虚函数表,来记录对应的函数地址,为此,在class A的内存地址中要有一个vfptr_A指针指向这个虚表,所以class A的大小为指针大小,即4.(注意,无论类中有多少个虚函数,它们的大小都是4,因为内存中只需要保存这个指针即可)。 对于class B,它是public继承A,虽然它也有一个虚函数,但是从结果看,B应该和A都在B的vtable(虚表中),所以class B的大小为4. 对于class C,它是vitual 继承A,所以要有一个指向父类A的指针,占有4字节大小aa()是继承自class A的虚函数,从结果来看,它没有在内存中占有空间,所以C的大小为sizeof(A)+4=8. 对于class D,它是虚继承class A,同上,要有一个指向父类A的指针,同时,class D中有虚函数,所以要有一个指向虚表的指针,所以sizeof(D)=sizeof(A)+4+4=12
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部