C++中类的大小

    添加时间:2013-5-3 点击量:

    起首看一个例子:



     1 #include <iostream>
    
    2 using namespace std;
    3
    4 class A{};
    5
    6 class B
    7 {
    8 int b;
    9 char c;
    10 };
    11
    12 class C
    13 {
    14 int c1;
    15 static int c2;
    16 };
    17 int C::c2 = 1;
    18
    19 class D:public C,public B{
    20 int d;
    21 };
    22 int main()
    23 {
    24 cout<<sizeof(A)=<<sizeof(A)<<endl;
    25 cout<<sizeof(B)=<<sizeof(B)<<endl;
    26 cout<<sizeof(C)=<<sizeof(C)<<endl;
    27 cout<<sizeof(D)=<<sizeof(D)<<endl;
    28
    29 return 0;
    30 }


    运行成果为:


    sizeof(A)=1


    sizeof(B)=8


    sizeof(C)=4


    sizeof(D)=16



    对于类A来说,固然A是一个空类,但为了便于空类进行实例化,编译器往往会给它分派一个字节,如许A实例化后便在内存中有了一个独一无二的地址.对于类B,B的大小应为sizeof(int)+sizeof(char)=5,然则推敲内存对齐,B的大小应为8.对于类C,类的静态成员变量被放在全局区,和类的通俗成员并没有放在一块。类的静态成员被声明后就已存在,而非静态成员只有类被实例化后才存在。所以C的大小为sizeof(int)=4。D的大小为B+C的大小+自身数据成员的大小,一共为16.



    ==========================分别线在这里====================================


    下面评论辩论含有虚函数的类的大小:



     1 #include <iostream>
    
    2 using namespace std;
    3
    4 class A
    5 {
    6 public:
    7 void virtual aa(){};
    8 };
    9
    10 class B:public A
    11 {
    12 void virtual bb(){};
    13 };
    14
    15 class C:virtual A
    16 {
    17 public:
    18 void virtual aa(){};
    19 void cc(){};
    20 };
    21
    22 class D:virtual A
    23 {
    24 public:
    25 void virtual dd(){};
    26 };
    27
    28 int main()
    29 {
    30 cout<<sizeof(A)=<<sizeof(A)<<endl;
    31 cout<<sizeof(B)=<<sizeof(B)<<endl;
    32 cout<<sizeof(C)=<<sizeof(C)<<endl;
    33 cout<<sizeof(D)=<<sizeof(D)<<endl;
    34
    35 return 0;
    36 }


    运行成果为:


    sizeof(A)=4


    sizeof(B)=4


    sizeof(C)=8


    sizeof(D)=12


    对于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

    我俩之间有着强烈的吸引力。短短几个小时后,我俩已经明白:我们的心是一个整体的两半,我俩的心灵是孪生兄妹,是知己。她让我感到更有活力,更完美,更幸福。即使她不在我身边,我依然还是感到幸福,因为她总是以这样或者那样的方式出现在我心头。——恩里克·巴里奥斯《爱的文明》
    分享到: