c++-内存布局模型

1.1、 无继承, 无虚函数

class A {
private:
    short pri_short_a;
public:
    int i_a;
    double d_a;
    static char ch_a;
    void funcA1() {
        pri_short_a = 1;
        i_a = 2;
        d_a = 3.1;
    }
};

char A::ch_a;

int main() {
    A a;
    a.funcA1();
    cout << sizeof a << endl;
    char *ptr = (char *) &a;
    cout << *(short *) ptr << endl;
    cout << *(int *) (ptr + 4) << endl;
    cout << *(double *) (ptr + 8) << endl;
}

输出
在这里插入图片描述

内存布局
在这里插入图片描述

说明

1、静态数据成员属于类, 不占用具体对象内存
2、成员函数在代码区,不占用具体对象内存
3、数据成员的访问级别不影响其在内存中的排列和大小,均是按照声明的顺序在内存中有序布局,并适当对齐

1.2、 无继承, 有虚函数

class A {
private:
    short pri_short_a;
public:
    int i_a;
    double d_a;
    static char ch_a;

    void funcA1() {
        pri_short_a = 1;
        i_a = 2;
        d_a = 3.1;
    }

    virtual void funcA2() {
        cout << "virtual void funcA2" << endl;
    }

    virtual void funcA3() {
        cout << "virtual void funcA3" << endl;
    }

};

char A::ch_a;

using F = void (*)();

int main() {
    A a;
    a.funcA1();
    cout << sizeof a << endl;
    char *ptr = (char *) &a;

    // 虚表验证
    cout << "虚表验证: " << endl;
    // 取虚表头指针
    auto *vptr = (long long *) (*(long long *) ptr);
    F f;
    f = (F) *vptr;
    cout << "虚表第1个函数: ";
    f();

    f = (F) *(vptr + 1);
    cout << "虚表第2个函数: ";
    f();

    // 数据验证
    // 取数据首地址
    auto *dptr = ptr + 8;
    cout << "数据区验证: " << endl;
    cout << *(short *) (dptr) << endl;
    cout << *(int *) (dptr + 4) << endl;
    cout << *(double *) (dptr + 8) << endl;
}

输出结果
在这里插入图片描述

内存布局
在这里插入图片描述
在这里插入图片描述

2.1 单一继承+虚函数布局

class A {
private:
    short pri_short_a;
public:
    int i_a;
    double d_a;
    static char ch_a;

    void init() {
        pri_short_a = 1;
        i_a = 2;
        d_a = 3.1;
    }

    virtual void funcA2() {
        cout << "virtual void A::funcA2" << endl;
    }

    virtual void funcA3() {
        cout << "virtual void A::funcA3" << endl;
    }

};

char A::ch_a;

class B : public A {
public:
    void funcA2() override {
        cout << "virtual void B::funcA2" << endl;
    }
};


using F = void (*)();

void memory_layout(char* ptr) {
    // 虚表验证
    cout << "虚表验证: " << endl;
    // 取虚表头指针
    auto *vptr = (long long *) (*(long long *) ptr);
    F f;
    f = (F) *vptr;
    cout << "虚表第1个函数: ";
    f();

    f = (F) *(vptr + 1);
    cout << "虚表第2个函数: ";
    f();

    // 数据验证
    // 取数据首地址
    auto *dptr = ptr + 8;
    cout << "数据区验证: " << endl;
    cout << *(short *) (dptr) << endl;
    cout << *(int *) (dptr + 4) << endl;
    cout << *(double *) (dptr + 8) << endl;
    cout << "*****************************\n" << endl;
}

int main() {
    A a;
    a.init();
    cout << sizeof a << endl;
    char *ptr = (char *) &a;
    memory_layout(ptr);


    B b;
    b.init();
    cout << sizeof b << endl;
    A* x = &b;

    ptr = (char *) x;
    memory_layout(ptr);
}

运行结果
在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值