C++对象内存结构模型 - 单一对象内存结构

本文探讨了C++中的单一对象内存结构,包括普通对象和带虚方法的对象。普通对象按照成员顺序排列,8字节对齐。带虚方法的对象在内存中额外包含虚表指针,用于指向虚方法。GCC编译器对虚析构函数处理有特殊方式,如D0Ev和D1Ev。D0Ev用于delete操作,D1Ev用于栈变量释放。纯虚函数类无法实例化,故无实例内存结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 单一对象内存结构

1.1 普通C++对象内存结构

class CObject
{
private:
    int        mv1;
    long long  mv2;
    char       mv3;

public:
    int  GetValue1() const;
    void SetValue1(int val);
};

普通C++对象内存结构

普通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();
};

带虚方法的C++对象内存结构

(1) 对象结构顶部多出一个虚标指针,指向CObject2虚标的第三个字段。

(2) 需要中包含了CObject2对象的的类型信息和虚方法指针。

(3) GCC编译器对虚析构方法在编译后会生成两个函数符号,符号名分别以D0Ev和D1Ev结尾。

(4) D1Ev包含析构函数的代码逻辑,以及对基类D1Ev析构函数的调用。D0Ev会在调用了本类的D1Ev之后,会释放当前类所占用的堆内存。因此,delete操作会调用D0Ev析构函数,栈变量释放则会调用D1Ev。

(5) 带有纯虚函数的类本身不能被实例化,因此没有对应的实例内存结构可描述。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值