MSVC查看类的对象内存储器布局

MSVC查看类的对象内存布局

        虽说自己对内存对象内存布局这一块还算比较熟悉(鄙人这么认为),但是实际要可视化一个内存布局,还是没做过,今天在网上瞎逛,突然发现了MSVC居然支持输出对象的布局结构,这个命令嘛,就是-d1reportSingleClassLayout和-d1reportAllClassLayout了。

        顾名思义,前者用于输出指定名字的类的结构,后者则是输出全部的类的结构,试了下后面的命令,发现按下Enter键后,留给鄙人的不是这个文件所得对应的类的内存结构,而是将近几秒的刷屏.....所以还是-d1reportSingleClassLayout靠谱,根据我的实验,-d1reportSingleClassLayout会输出strstr匹配类名的类的结构。  

        比如我定义了四个类:MyCAA,MyCAAPre,NextMyCAA,MidMyCAAMid

        如果我输入命令:cl main.cpp -d1reportSingleClassLayoutMyCAA,

        此时会把我上面定义的四个类的全部内存布局输出来。如下图所示:

MSVC查看类的对象内存储器布局

类的布局结构

对于,MSVC的类的布局结构一般按照下面的顺序布局的:

  1. 虚表指针(如果有的话)
  2. 基类
  3. 类的成员变量
如下面所定义的类,
#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;
}
其内存布局结构为:
MSVC查看类的对象内存储器布局
其中的adjustor不知道啥意思,没找到!

如果图方便,可以再工程的c++选项的命令行加上该命令,如需查看类MyOwnCls,则添加命令:/d1reportSingleClassLayoutMyOwnCls 即可,会生成对应的.layout文件。