C++中类的大小计算方法总结

来源:互联网 发布:淘宝可以apple pay吗 编辑:程序博客网 时间:2024/05/16 11:30
 C++中类的成员函数,静态成员是不占类的大小的。类的大小等于基类的大小+子类个non-static成员变量的大小再+非虚基类大小,如果有多态性还要考虑vptr(可能不止一个)大小,这里成员变量是会被字节对齐的。

1、空类的大小为1字节

2、字节对齐的问题 
    成员变量需要整齐的存储,所以若是有不同类型的变量(本身占用字节数不同),则所有变量的大小会按照最大的的大小进行补齐,比如说,若是一个类中有个bool型和int型,则bool型也会占用4个字节。若最大的为short,则bool型或者char型会补齐成为2个字节,最大的为double,则都补齐成为8字节。
    并且即使成员完全相同但排列不同计算出的类的大小也可能完全不同。
如下例:
一个类的大小可以被下面的方式改变:
class   A
{
 bool   a;
 int   b;
 bool   c;
};   //sizeof   (A)  12   
  这个结果可能会让你吃惊,因为A的成员总数是6个字节:1+4+1个字节。那另6字节是哪儿来的?编译器在每个bool成员后面都插入了3个填充字节以保证每个成员都是按4字节排列,以便分界。你可以减少A的大小,通过以下方式:  
class   B
{
 bool   a;
 bool   c;
 int   b;
};   //   sizeof   (B)   8    
  这一次,编译器只在成员c后插入了2个字节。因为b占了4个字节,所以就很自然地把它当作一个字的形式排列,而a和c的大小1+1=2,再加上2个字节就刚好按两个字的形式排列B。

3、虚函数:如果有虚函数,类的大小+4个字节。(用来存放vptr)
例:
class   A
{
        virtual   void   foo();
        int   i;
        char   c;
};   sizeof(A)   =   12   =   vptr   +   sizeof(i)   +   (sizeof(c)   +3);

class   B   :public   A
{
        void   foo1();
        static   int   haha;
        long       ll;
}   sizeof(B)   =   16   =   sizeof(A)   +   sizeof(ll);
4、虚基类指针:如果是虚继承,则子类的大小为:虚基类的大小 + 4个字节(用来存放指向虚基对象的指针)+子类新增成员的大小。
例: 
class A
{
 virtual   void   foo(){};
    int   i; 
 int j;
  
};
class C: virtual public A
{
    char   sz[10];
};sizeof(C)  = sizeof(A) + 4 + sizeof(sz[10])  = 12+4+10+2(补齐sz)=28
0 0