论c++中对象的内存布局

对象的内存布局就是计算对象所占用的内存大小,对象的大小只包含数据成员,类成员函数是执行代码,不属于对象的数据成员。在不讨论类的继承,以及虚函数的时候。一个对象的大小的计算公式一般为:

对象的大小 = 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

posted @ 2013-05-12 21:10  chaoguo1234  阅读(189)  评论(0编辑  收藏  举报