在C++对象中:
- 数据成员:
- static
- nonstatic
- 函数成员:
- static
- nonstatic
- virtual
C++ 对象内存布局
C++ 对象模型是从简单对象模型派生而来,并对内存空间和存取时间做了优化。
- nonstatic data members 被配置于每一个class object之内,static data members 则被存放在个别的class。
- virtual function 以2个步骤支持:
- 每一个class产生出一堆指向virtual function的指针, 放在表格之中, 这个表格即为virtual table(vtbl)。
- 每一个class object安插一个指针,指向相关的virtual table,这个指针即为vptr。vptr的设定和重置都由每一个class的constructor,destructor,copy assignment运算符自动完成。
如图所示:
C++ 类的内存占用大小
- 空类
空类没有任何数据成员,但实际情况是空类的内存占用为1字节。因为如果对象不完全占用内存空间,那么空类就无法取得 实例对象的地址,this指针失效,因此不能实例化。
但类的定义是由成员数据和成员函数组成,在没有成员数据的情况下,还可以有成员函数,仍然需要实例化。 - 数据成员开销
- 内存对齐
- 虚函数表的开销
参考资料
1、《深度探索C++对象模型》 [美] Stanley B.Lippman