1 单一对象内存结构
1.1 普通C++对象内存结构
class CObject { private: int mv1; long long mv2; char mv3; public: int GetValue1() const; void SetValue1(int val); };
普通C++对象与C中的struct等价,成员按顺序排列,并以8字节对齐(不同环境编译器有差异)。 普通成员函数作为独立函数符号存在,并不会存储在对象数据结构中。
1.2 带虚方法的C++对象内存结构
class CObject2 { private: private: int mv1; long long mv2; char mv3; public: virtual ~CObject2(); virtual long long GetValue2() const; virtual void SetValue2(); };
(1) 对象结构顶部多出一个虚标指针,指向CObject2虚标的第三个字段。
(2) 需要中包含了CObject2对象的的类型信息和虚方法指针。
(3) GCC编译器对虚析构方法在编译后会生成两个函数符号,符号名分别以D0Ev和D1Ev结尾。
(4) D1Ev包含析构函数的代码逻辑,以及对基类D1Ev析构函数的调用。D0Ev会在调用了本类的D1Ev之后,会释放当前类所占用的堆内存。因此,delete操作会调用D0Ev析构函数,栈变量释放则会调用D1Ev。
(5) 带有纯虚函数的类本身不能被实例化,因此没有对应的实例内存结构可描述。