VS2010命令行下查看虚函数表和类内存布局
来源:互联网 发布:卡密充值网站源码 编辑:程序博客网 时间:2024/06/05 10:51
VS2010命令行下查看虚函数表和类内存布局
——《深度探索C++对象模型》读书札记系列
在学习多重继承下的Virtual functions时,需要分析派生类的虚函数表(vtable),但是在网上找了好几种Hack vtable方法,结果都不尽如人意。没想到MS Compiler(以VS2010为例)有打印vtable的编译选项,真是太好了!
1. 打开“Visual Studio Command Prompt (2010)”,如下
该CMD下具有VS2010命令行下的一些编译、链接等工具,例如cl.exe。
2. 编写一个cpp文件
以《深度探索C++对象模型》的160页的代码(160.cpp)为例,如下
class Base1 {public:Base1();virtual ~Base1();virtual void speackClearly();virtual Base1* clone() const;protected:float data_Base1;};class Base2 {public:Base2();virtual ~Base2();virtual void mumble();virtual Base2* clone() const;protected:float data_Base2;};class Derived : public Base1, public Base2 {public:Derived();virtual ~Derived();virtual Derived* clone() const;protected:float data_Derived;};int main(void){return 0;}
3、使用cl命令的/d1 reportAllClassLayout或reportSingleClassLayoutXXX选项。这里的reportAllClassLayout选项会打印大量相关类的信息,一般用处不大。而reportSingleClassLayoutXXX选项的XXX代表要编译的代码中类的名字(这里XXX类),打印XXX类的内存布局和虚函数表(如果代码中没有对应的类,则选项无效)。
举例如下
cl /d1 reportSingleClassLayoutBase1 160.cpp
运行结果下
可以看出Base1的大小为8个字节,共有3个虚函数,分别是~Base1、speackClearly和clone,对于学习上述的示例代码绰绰有余咯~~
参考资料:
1、http://stackoverflow.com/questions/3062647/how-to-get-every-virtual-function-index-just-as-the-compiler-does
2、http://blog.csdn.net/lfhfut/article/details/4666142
3、http://blogs.msdn.com/b/vcblog/archive/2007/05/17/diagnosing-hidden-odr-violations-in-visual-c-and-fixing-lnk2022.aspx
- VS2010命令行下查看虚函数表和类内存布局
- VS2010命令行下查看虚函数表和类内存布局
- VS2010命令行下查看虚函数表和类内存布局
- 具有虚函数的类的大小 & VS2010命令行查看虚函数表和类内存布局
- 具有虚函数的类的大小 & VS2010命令行查看虚函数表和类内存布局
- 查看虚函数表和类内存布局,以及使用MSVC与GCC hack验证
- vs2010查看类的布局
- 虚函数的内存布局(下)
- linux内存段及命令行下查看
- vs2010中查看内存和寄存器
- [C++]VS2008使用命令行选项查看对象的内存布局
- [C++]VS2008使用命令行选项查看对象的内存布局
- VS2008使用命令行选项查看对象的内存布局
- VS2008使用命令行选项查看对象的内存布局
- VS使用命令行选项查看对象的内存布局
- 如何使用VS2008命令行选项查看对象的内存布局 ?
- 虚函数在子类和父类中的内存布局
- 虚函数在子类和父类中的内存布局
- Linux块设备驱动
- 块设备驱动编写总结
- “2 overloads have no legal conversion for 'this' pointer”错误
- 杭电2057
- 操作系统_再识(Linux从文件到字符设备)
- VS2010命令行下查看虚函数表和类内存布局
- 展望2025:决定未来经济的12大颠覆技术
- 64位Ubuntu编译android的环境配置问题
- 在ubuntu 12.10上装root
- GoF23种设计模式之行为型模式之迭代器模式
- 通向GEANT4的结晶
- 让vi变得上手而好用
- 自行安装Geant4+OpenGL Qt
- scientific linux cern63安装、geant4安装