[C++基础]043_看图识C++内存布局

时间:2023-01-11 22:58:15

序言

    首先感谢bolow大神的指导,他教会我查看Visual Studio下C++内存布局的方法,不敢独享,特此分享。

    1. Visual Studio命令行查看内存布局的方法

cl Test.cpp /d1reportSingleClassLayoutBase

    比如你新建了一个源文件Test.cpp,里面有一个类Base,那么上面的命令就能查看类Base的内存布局了。当然,这里我假设你会用Visual Studio编译工具cl,如果不会,可以参考博主博客《[C++基础]042_用Visual Studio的命令行编译源码》。

看图认识C++内存布局

        以下图片所展示的内存布局主要有:单纯类,有虚函数的复杂类,有继承关系的单纯类,有虚函数有继承关系的复杂类,多重继承类,钻石型继承类。



[C++基础]043_看图识C++内存布局

虽然类Base里有foo函数,但是我们的内存布局里没有函数的位置,这是为什么呢?参见博主另篇博客[C++基础]044_C++的成员函数本质 


 [C++基础]043_看图识C++内存布局

这里我们有虚函数了,不过虚函数也只是占用4个字节。无论你有多少个虚函数,仍然是占4个字节。因为它只是个指向虚函数表的指针而已。


 [C++基础]043_看图识C++内存布局

有继承关系时,子类的头部是基类的内存布局。


 [C++基础]043_看图识C++内存布局

有虚函数的继承关系时,第一个存储的仍然是虚函数表指针。


 [C++基础]043_看图识C++内存布局

多重继承,不过,注意一下,这里有两个虚函数表指针,切记。


 [C++基础]043_看图识C++内存布局

钻石型继承关系,也不难,就是往里面死命的填。

其他博文推荐

     C++ 对象的内存布局(上):http://blog.csdn.net/haoel/article/details/3081328

     C++ 对象的内存布局(下):http://blog.csdn.net/haoel/article/details/3081385