C++内存布局详解

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/beyond702/article/details/79185973

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

展开阅读全文

没有更多推荐了,返回首页