天天看点

sizeof计算类的大小

转载地址为:http://blog.csdn.net/u013074465/article/details/42780825

一个空的类的大小为1个字节;

1.类的大小为类的非静态成员数据的类型大小之和,也就是说静态成员数据不作考虑。

c++将类的非静态数据成员存放在类的每个对象中,对于继承而来的非静态数据成员(不管基类是否为虚)都是如此;

静态数据成员不是类的组成部分,它存放在程序的全局数据区中,独立于任何类的对象而存在,不会影响类对象的大小;类无论产生多少对象,static数据成员都仅存在一份实例;静态数据成员不在类的对象中,因此存取static数据成员不需要通过类对象;

如果去静态数据成员的地址,会得到一个指向其数据类型的指针,而不是一个指向其类成员的指针,因为静态数据成员并不包含在任何一个类对象中;

而非静态数据成员直接存放在每个类对象中,除非经由显示或隐式类对象,否则无法直接存取他们,只要程序员在一个成员函数中直接处理一个非静态数据成员,即隐式类对象就会发生。

要对一个非静态数据成员存取,编译器需要把类对象的起始地址加上该数据成员的偏移位置;

2、普通成员函数与sizeof无关

类的普通成员、静态成员函数是不占类内存的,至于函数指针在类中有虚函数的时候存在一个虚函数表的指针,即,类里如果有虚函数则它的sizeof会增加4个字节。其实类的成员函数实际上与普通的全局函数一样,只不过编译器在编译的时候录,会在成员函数上加一个参数,传入这个对象的指针。成员函数地址是全局已知的,对象的内存空间里无法保存成员函数的地址。对您成员函数的调用在编译时就确定了。函数是不算到sizeof中的,因为函数是代码,被各个对象公用,跟数据处理方式不同。对象中不必有函数指针,因为对象没必要知道它的各个函数的地址。类的属性是指类的数据成员,他们是实例化一个对象时就为数据成员分配内存了,而且每个对象的数据成员是对立的,而成员函数是共有的。静态成员函数与一般成员函数的唯一区别就是没有this指针,因此不能访问非静态数据成员。总之,程序中的所有函数都是位于代码区的。

3、虚函数由于要维护在虚函数表,所以要占据一个指针大小,也就是4字节;

4、类的总大小也遵守类似class字节对其的,调整规则;

5、如果子类中也含有虚函数,那么它不会有自己的虚表,而是和基类公用,因此派生类的大小不包含派生类虚表所占用的空间。

继续阅读