天天看点

关于类的sizeof()

1、  空类的大小为1(没有数据成员的类).why?C++编译器不允许对象的大小为0,因为内存大小为0的类根本没地方存储,为了找到这个类编译器通常会添加一个大小为1的缺省的成员(char类型的)。如果有自定义的变量,那么自定义的变量将替换掉这个变量。

2、  简单类。简单类要考虑内存对齐的情况,还要考虑静态数据不是sizeof()计算的范围。因为它存放在全局数据区,而不是栈里。

3、  带虚函数的类。带虚函数的类(不管有几个虚函数,因为子类与父类的虚函数都存放在同一个虚函数表中)里面有一个虚函数指针,所以要在简单类的基础上加上4才可以。

4、  普通的继承:代码如下classA{public:  int a;char b;}  class B:public A{ public: char c},这里的sizeof(B)会根据编译器的不同而不同,比如codeblocks为8,而vs2010为12. 一般说来普通的继承的大小为sizeof(基类)+sizeof(派生类),然后再考虑对齐的问题,内存大小应该类中最大数据元素所占内存的整数倍,(具体要看编译器的实现原理).

5、  子类虚继承父类。普通虚继承(不包含虚函数):sizeof(子类)=sizeof(父类)+sizeof(子类的数据成员)+sizeof(虚表指针)。对于含有虚函数的虚继承,子类和父类的虚函数存放在不同虚表中。但是在具体的实现上不同的编译器还是不同的,如:class A{ public: int a;};

class B:virtual public A{public:int a;  virtual void f(){}  }; sizeof(B)在codeblocks中是12,而在vs2010中是16. 又如:class A{public: int a; virtual void set(){}  };classB:virtual public A{public:int a;  virtualvoid set(){}  }; sizeof(B) 在codeblocks中是16,而在vs2010中是20.

6、简单的多重继承:sizeof(子类)=sizeof(父类1)+sizeof(父类2)+……+sizeof(父类n).如果是多重虚继承,虚继承存在的意义就是为了减少内存开销和二义性,实现对象共享。例如:

class A{public : int a;  }; class B:virtual public A{ public:int b; };class C:virtual public A{ public:int c}; class D:public B,public A{ public: int d;};  得到的sizeof(D)的大小为20

7、  一个小例子:classA{}; class B{};  class{  public: virtual voif f(){} }: public D:publicB,public C{}; cout<<sizeof(A)<<” “<<sizeof(B)<<” “<<sizeof(C)<<”  “<<sizeof(D)<<endl;  根据编译器不同可能得到的是1,1,4,4 或者1,1,4,8.  不管类是否为空类都可以实例化,每一个被实例化的类都有独一无二的地址,即我们总是可以找到用地址找到它的。

继续阅读