引言
各种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 |
clang 3.4 | clang -Xclang -fdump-record-layouts data.cpp | 要求data.cpp中有对相关类做sizeof求值的语句,输出在stdout,类似 *** Dumping AST Record Layout |
VC++ 2010 | 添加编译选项 /d1reportSingleClassLayout<类名> :输出单个类相关布局 或 /d1reportAllClassLayout: 输出所有类相关布局 | 编译时输出在“输出”窗口中,类似如下: 1> class A size(8): |
测试所用代码文件
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; }