C++内存布局详解

C++类中有两种成员变量,三种成员函数:

其中对象的内存布局中只包含非静态的成员变量,静态的成员变量是在全局数据区。

C++中类的继承类型,以及对应的类实例内存布局如下图:

1. 单继承

继承情况如下:

对应的对象内存布局:

2. 一般多继承(非菱形)

继承情况如下:

对应的对象内存布局:

3. 一般多继承(菱形)

类继承情况:

对应的对象内存布局:

4. 单虚继承

虚继承解决了菱形继承中最派生类拥有多个间接父类实例的情况。虚继承的派生类的内存布局与普通继承很多不同,主要体现在:

  • 虚继承的子类,如果本身定义了新的虚函数,则编译器为其生成一个虚函数指针(vptr)以及一张虚函数表。该vptr位于对象内存最前面。
    • vs非虚继承:直接扩展父类虚函数表。
  • 虚继承的子类也单独保留了父类的vprt与虚函数表。这部分内容接与子类内容以一个四字节的0来分界。
  • 虚继承的子类对象中,含有四字节的虚表指针偏移值。

类的继承关系:

对应的对象内存布局:

5. 多虚继承(菱形)

类的继承关系:

对应的对象内存布局:

 

参考:

1. https://www.cnblogs.com/QG-whz/archive/2015/10/25/4909359.html

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页