【C++对象模型】使用gcc、clang和VC++显示C++类的内存布局
2015-08-19 15:12
786 查看
引言
各种C++实现对C++类/对象的内存布局可能有所不同,包括数据成员的顺序、虚函数表(virtual table: vtbl)的结构、继承关系的处理等。了解C++类/对象的布局,对于理解C++各种机制,正确合理地进行设计和开发有很大的帮助。主流编译器的支持
本文所述的3款主流编译器都提供打印/导出C++类/对象的内存布局的功能,现用表格列出其特性和用法,测试用的代码文件列于文后(data.cpp)编译器及验证版本 | 用法 | 说明 |
gcc 4.8.4 | gcc --fdump-class-hierarchy data.cpp | 导出的布局图示在data.cpp同一目录下的一个.class文件中, 如data.cpp.002t.class,内容示例: VTT for A A::_ZTT1A: 4u entries 0 ((& A::_ZTV1A) + 24u) 8 ((& A::_ZTC1A0_1Y) + 24u) 16 ((& A::_ZTC1A8_1Z) + 24u) 24 ((& A::_ZTV1A) + 48u) Class A size=16 align=8 base size=16 base align=8 A (0x0x7f9dbc60c540) 0 vptridx=0u vptr=((& A::_ZTV1A) + 24u) Y (0x0x7f9dbc5c11a0) 0 nearly-empty primary-for A (0x0x7f9dbc60c540) subvttidx=8u X (0x0x7f9dbc5ccae0) 0 empty virtual vbaseoffset=-24 Z (0x0x7f9dbc5c1208) 8 nearly-empty subvttidx=16u vptridx=24u vptr=((& A::_ZTV1A) + 48u) X (0x0x7f9dbc5ccae0) alternative-path |
clang 3.4 | clang -Xclang -fdump-record-layouts data.cpp | 要求data.cpp中有对相关类做sizeof求值的语句,输出在stdout,类似 *** Dumping AST Record Layout 0 | class A 0 | class Y (primary base) 0 | (Y vtable pointer) 8 | class Z (base) 8 | (Z vtable pointer) 0 | class X (virtual base) (empty) | [sizeof=16, dsize=16, align=8 | nvsize=16, nvalign=8] |
VC++ 2010 | 添加编译选项 /d1reportSingleClassLayout<类名> :输出单个类相关布局 或 /d1reportAllClassLayout: 输出所有类相关布局 | 编译时输出在“输出”窗口中,类似如下: 1> class A size(8): 1> +--- 1> | +--- (base class Y) 1> 0 | | {vbptr} 1> | +--- 1> | +--- (base class Z) 1> 4 | | {vbptr} 1> | +--- 1> +--- 1> +--- (virtual base X) 1> +--- 1> 1> A::$vbtable@Y@: 1> 0 | 0 1> 1 | 8 (Ad(Y+0)X) 1> 1> A::$vbtable@Z@: 1> 0 | 0 1> 1 | 4 (Ad(Z+0)X) |
测试所用代码文件
data.cpp#include <cstdio> class X {}; class Y : public virtual X {}; class Z : public virtual X {}; class A : public Y, public Z {}; int main(int argc, char** argv) { printf("Ptr: %lu\n", sizeof(void*)); printf("X: %lu\n", sizeof(X)); printf("Y: %lu\n", sizeof(Y)); printf("Z: %lu\n", sizeof(Z)); printf("A: %lu\n", sizeof(A)); return 0; }
相关文章推荐
- C/C++ 中的特殊关键字:volatile, register, restrict, __attribute__
- C++ 小记 vector 容器(一)
- C/C++代码静态检查工具Cppcheck在VS2013开发环境中的安装配置和使用
- 求任意一个数字的阶乘《C语言版》
- 算法 - 乞讨n中位数(C++)
- C++ Web Programming
- c++ primer plus 第九章《编程题9.6.2》
- c++ primer plus 第十章-编程题6
- C语言数组和指针的区别
- 【C语言】typedef
- 第五章 数组与C++标准库类模板vector
- (转载)C++ using namespace std 用法深入解析
- C++编程所遇到的error(持续更新和补充)
- 关于c语言和c++的区别和联系
- C++之动态绑定和静态绑定
- C++缓冲区的知识
- 时间转换<将秒转换为天、小时、分钟>
- 任意输入三个数判断其是否为三角形
- C++构造函数的调用
- 保存FLTK的配置方法