对象的内存布局就是计算对象所占用的内存大小,对象的大小只包含数据成员,类成员函数是执行代码,不属于对象的数据成员。在不讨论类的继承,以及虚函数的时候。一个对象的大小的计算公式一般为:
对象的大小 = sizeof(数据成员1) + sizeof(数据成员2) + ... + sizeof(数据成员n)。
但是,即便在这种情况下,仍然有3中特殊情况不满足这个公式:
1 空类:
空类中没有任何数据成员。按照公式计算,此类的对象所占用的内存空间应该为0.而实际情况是,空类的对象对象长度为1字节。如果类对象完全不占用内存空间,就无法取得实例化对象的地址,this指针失效。而类的定义有成员数据和成员函数组成,在没有成员数据的情况下,仍可以有成员函数,因此,就为空类分配了1字节的空间用来实例化类。这1字节并没有被使用。
2 静态数据成员:
静态的数据成员属于类,而不属于类的对象,因此,类对象的大小不包括静态数据成员。
3 内存对齐:
这种情况最为复杂。
为什么需要内存对齐,请参考http://blog.csdn.net/lgouc/article/details/8235471
对齐规则,请参考http://baike.baidu.com/view/4786260.htm
需要补充的是,当类里面含有嵌套的类成员时,不会将类的整体长度参与到对齐计算中,而是以嵌套定义的结构体所使用的对齐值进行对齐。比如:
#include <iostream> #pragma pack(8) using namespace std; class X { char a; char b[4]; short c; }; class Y { int a; X b; }; int main() { cout << sizeof(X) << endl; cout << sizeof(Y) << endl; }
按照对齐规则,类X的大小为8,但是在计算类Y的大小时,并不是按类X的大小8参与到对齐计算中。由于类X的整体对齐系数 = min(max(char, char, short), 8) = 2, 所以,应该用类X的整体对齐值2来参与类Y的对齐计算,这样算出来为类Y大小为12