MSVC查看类的对象内存布局
2014-06-09 10:17
246 查看
虽说自己对内存对象内存布局这一块还算比较熟悉(鄙人这么认为),但是实际要可视化一个内存布局,还是没做过,今天在网上瞎逛,突然发现了MSVC居然支持输出对象的布局结构,这个命令嘛,就是-d1reportSingleClassLayout和-d1reportAllClassLayout了。
顾名思义,前者用于输出指定名字的类的结构,后者则是输出全部的类的结构,试了下后面的命令,发现按下Enter键后,留给鄙人的不是这个文件所得对应的类的内存结构,而是将近几秒的刷屏.....所以还是-d1reportSingleClassLayout靠谱,根据我的实验,-d1reportSingleClassLayout会输出strstr匹配类名的类的结构。
比如我定义了四个类:MyCAA,MyCAAPre,NextMyCAA,MidMyCAAMid
如果我输入命令:cl main.cpp -d1reportSingleClassLayoutMyCAA,
此时会把我上面定义的四个类的全部内存布局输出来。如下图所示:
类的布局结构
对于,MSVC的类的布局结构一般按照下面的顺序布局的:
虚表指针(如果有的话)
基类
类的成员变量
如下面所定义的类,
其内存布局结构为:
其中的adjustor不知道啥意思,没找到!
如果图方便,可以再工程的c++选项的命令行加上该命令,如需查看类MyOwnCls,则添加命令:/d1reportSingleClassLayoutMyOwnCls 即可,会生成对应的.layout文件。
顾名思义,前者用于输出指定名字的类的结构,后者则是输出全部的类的结构,试了下后面的命令,发现按下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文件。
相关文章推荐
- [C++]VS2008使用命令行选项查看对象的内存布局
- VS使用命令行选项查看对象的内存布局
- [C++]VS2008使用命令行选项查看对象的内存布局
- VS2008使用命令行选项查看对象的内存布局
- 查看Java对象在内存中的布局
- 查看java对象在内存中的布局
- [C++]VS2008使用命令行选项查看对象的内存布局
- VS2008使用命令行选项查看对象的内存布局
- vs 生成类图和查看对象的内存布局
- 查看虚函数表和类内存布局,以及使用MSVC与GCC hack验证
- 如何使用VS2008命令行选项查看对象的内存布局 ?
- 使用sos查看.NET对象内存布局
- vs2005中查看对象的内存布局
- 【整理】查看C++对象内存布局
- VS 查看对象内存布局
- C++对象布局及多态实现探索之内存布局(转载)
- C++对象布局及多态实现探索之内存布局
- 新手谈对象内存布局与内存对齐
- C++ 对象的内存布局(上)
- C++ 对象的内存布局(下)