分类: LINUX
2012-08-01 11:12:34
由于存在隐含成员和添补字节,导致“一个内存对象的实际大小不像它看上去的那样”。从应用编程角度讲,我们根本没有必要了解这些底层的技术细节,因为它们是语言实现所关心的事情;但是如果你了解了这些知识,可以使你在编程的时候头脑中始终保存一个清晰的运行时对象试图,有助于一次性编写出争取的代码来。
一个C++的复合类型对象,其可能的隐含成员包括:若干vptr、默认构造函数、默认拷贝构造函数、析构函数和默认拷贝赋值函数。至少在现阶段是这样的。
对于vptr而言,当一个类表现多态特征时,其对象就是含有至少一个vptr成员,这包括下面的情况:
l 该类含有虚函数,无论是自己定义的还是从基类继承下来的:
l 该类的继承链中至少有一个基类是多态类;
l 该类至少有一个虚基类;
l 该类包含了多态的成员对象,但是该类不一定是多态类。
显然,当创建一个对象的时候,其隐含的成员vptr必须被初始化指向正确的vtable,而且这个初始化工作只能在运行时完成,所以这个任务自然交给了构造函数。
C++对象模型要充分考虑对象数据成员的空间效率和访问速度,以优化性能。另外,每个对象必须占据足够大的内存空间以便容纳其所有非静态数据成员。因此,对象的实际大小可能比简单地把各个成员的大小加在一起的结果还大,而且与具体的环境有关,造成这种结果的原因主要两条:
1. 由编译器自动安插的额外隐含数据成员,以支持对象模型,例如vptr;
2. 出于对存取效率的考虑而增加的填补字节,以使对象的边界能够对齐到机器字节,即为WORD的整数倍。
所以建议你使用sizeof()计算一个对象的真实大小,对于各种情况下的隐含成员和对象的边界调整。更多资讯阅读: