使用 g++ 编译器打印 C++ 对象的布局

Posted

技术标签:

【中文标题】使用 g++ 编译器打印 C++ 对象的布局【英文标题】:Print layout of C++ object with g++ compiler 【发布时间】:2011-02-28 02:33:18 【问题描述】:

有没有办法使用 g++ 编译器或任何其他方式打印 C++ 对象的布局。 一个简化的例子(假设 int 占用 4 个字节)

class A
  int a;
;

class B:public A
  int b;

所以输出将是

A-
0      4
+  a   +

B-
0      4      8
+ A.a  +  b   +

了解对象的布局会很有用(在我的例子中是虚拟机代码)。

提前致谢。

问候, 扎西尔

【问题讨论】:

【参考方案1】:

C++ 没有自省功能。编译代码后,除了 typeidstd::type_info 可以为您提供的信息之外,有关类的所有信息都会丢失。

【讨论】:

我认为他不是在谈论运行时自省,而是在谈论一些能够告诉他编译器为他的代码中的对象选择的内存布局的编译器选项。【参考方案2】:

查看手册页,-fdump-class-hierarchy 可能吗?

【讨论】:

这是 g++ (gcc.gnu.org/onlinedocs/gcc-6.2.0/gcc/Developer-Options.html) 的一个选项,虽然我不确定为什么我的 g++ 无法识别它。【参考方案3】:

调试器需要您查找的信息,并在您使用-g 编译时为它们发出。在 ELF/DWARF 平台(如 Linux)上,您可以通过执行来查看其中的内容:

g++ -g -c foo.cc
readelf -w foo.o

在其他平台上,objdump -g foo.o 可能有效。

对于 ELF/DWARF,pahole 看起来是个不错的起点。

【讨论】:

以上是关于使用 g++ 编译器打印 C++ 对象的布局的主要内容,如果未能解决你的问题,请参考以下文章

我无法为 g++ 的 _cplusplus 宏打印值 201703L

#yyds干货盘点#Linux中编译C++代码的g++工具,以及g++的常用操作指令

如何使用 gdb 制作一个可以漂亮地打印每个对象的 C++ 函数?

转载图说C++对象模型:对象内存布局详解

c++对象模型之Data布局

gcc和g++的区别