虽说自己对内存对象内存布局这一块还算比较熟悉(鄙人这么认为),但是实际要可视化一个内存布局,还是没做过,今天在网上瞎逛,突然发现了MSVC居然支持输出对象的布局结构,这个命令嘛,就是-d1reportSingleClassLayout和-d1reportAllClassLayout了。
顾名思义,前者用于输出指定名字的类的结构,后者则是输出全部的类的结构,试了下后面的命令,发现按下Enter键后,留给鄙人的不是这个文件所得对应的类的内存结构,而是将近几秒的刷屏.....所以还是-d1reportSingleClassLayout靠谱,根据我的实验,-d1reportSingleClassLayout会输出strstr匹配类名的类的结构。
比如我定义了四个类:MyCAA,MyCAAPre,NextMyCAA,MidMyCAAMid
如果我输入命令:cl main.cpp -d1reportSingleClassLayoutMyCAA,
此时会把我上面定义的四个类的全部内存布局输出来。如下图所示:
类的布局结构
对于,MSVC的类的布局结构一般按照下面的顺序布局的:
- 虚表指针(如果有的话)
- 基类
- 类的成员变量
如下面所定义的类,
#include <stdio.h> class MyTestClsBase { int m_nA; }; class MyTestCls : public MyTestClsBase { public: int m_nVar; bool m_bVar; float m_fVar; static int ms_nVar; virtual void VirTest(){}; static void StaTest(){}; void Test(); }; int main() { return 0; }
其内存布局结构为:
其中的adjustor不知道啥意思,没找到!
如果图方便,可以再工程的c++选项的命令行加上该命令,如需查看类MyOwnCls,则添加命令:/d1reportSingleClassLayoutMyOwnCls 即可,会生成对应的.layout文件。
MSVC查看类的对象内存布局
时间: 2024-12-16 02:44:41