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

14

有没有一种方法可以使用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   +

了解对象的布局(在我的情况下是虚拟机代码)将会很有用。

提前感谢。

敬礼, Zaheer

3个回答

12

查看手册,也许可以使用 -fdump-class-hierarchy 选项?

需要注意的是,从GCC 8开始,-fdump-class-hierarchy选项已被替换为-fdump-lang-class


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

4
您所需要的信息是由调试器所需的,并且在使用 -g 编译时会为它们发出。在 ELF/DWARF 平台(例如 Linux)上,您可以通过执行以下命令来查看其中的内容:
g++ -g -c foo.cc
readelf -w foo.o

在其他平台上,objdump -g foo.o 可能有效。
对于 ELF/DWARF,pahole 看起来是一个不错的起点。

1

C++没有内省功能。一旦您的代码被编译,有关类的每个信息都会丢失,除了typeidstd::type_info可以提供的信息。


4
我认为他谈论的不是运行时内省,而是一些编译器选项,可以告诉他编译器为代码中的对象选择了哪种内存布局。 - Matteo Italia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接