怎么看C++对象的内存结构 和 怎么解密C++的name mangling
2012-12-23 23:01
393 查看
Dumping a C++ object’s memory layout with Clang这篇文章讲述了怎么用Clang来看C++对象的结构,回复中Marek提到了怎么在Visual Studio中看。具体方法如下:
C++项目右键属性,C/C++下的Command Line,加上这个选项
这样在编译时就会在output窗口看到所有的对象的内存结构了。
由于C++编译器会做Name Mangling,我们可以用undname这个工具来看到没有被mangling样子。
下面是个例子,假设我们有如下的A和B两个类。
它们通过/d1reportAllClassLayout的结果如下:
C++项目右键属性,C/C++下的Command Line,加上这个选项
/d1reportAllClassLayout
这样在编译时就会在output窗口看到所有的对象的内存结构了。
由于C++编译器会做Name Mangling,我们可以用undname这个工具来看到没有被mangling样子。
>undname Microsoft (R) C++ Name Undecorator Copyright (C) Microsoft Corporation. All rights reserved. Usage: undname [flags] fname [fname...] or: undname [flags] file
下面是个例子,假设我们有如下的A和B两个类。
class A { int a; public: void virtual foo(){}; }; class B:public A { int b; public: void foo(){}; };
它们通过/d1reportAllClassLayout的结果如下:
1> class A size(8): 1> +--- 1> 0 | {vfptr} 1> 4 | a 1> +--- 1> 1> A::$vftable@: 1> | &A_meta 1> | 0 1> 0 | &A::foo 1> 1> A::foo this adjustor: 0 1> 1> 1> class B size(12): 1> +--- 1> | +--- (base class A) 1> 0 | | {vfptr} 1> 4 | | a 1> | +--- 1> 8 | b 1> +--- 1> 1> B::$vftable@: 1> | &B_meta 1> | 0 1> 0 | &B::foo 1> 1> B::foo this adjustor: 0
相关文章推荐
- @清晰掉 C++ 中的 enum 结构在内存中是怎么存储的?
- C++对象模型之简述C++对象的内存布局
- 学习笔记-C/C++-结构体与sizeof,内存对齐的题目怎么做
- C/C++程序在运行时的内存结构
- 【C++】c++单继承、多继承、菱形继承内存布局(虚函数表结构)
- C++中类的内存结构解析
- C/C++程序运行时的内存结构
- C++内存结构
- C++中Name-mangling
- 怎么用C++提取任意一张图片的特征(从内存读取数据)
- C和C++怎么分配和释放内存,区别是什么
- c++单继承、多继承、菱形继承的内存布局(虚函数表结构)
- C++异常机制的实现方式和开销分析 (大图,编译器会为每个函数增加EHDL结构,组成一个单向链表,非常著名的“内存访问违例”出错对话框就是该机制的一种体现)
- C/C++内存结构
- 使用CL.EXE查看C++中类的内存结构
- 20140228:C++对象内存结构之虚函数
- C++的内存结构
- C++ name mangling
- C++ 根据vector 容器内存放的自定义结构的某个元素 进行升序降序排序
- C++二维数组的内存结构图与Java二维数组的内存结构图