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


有没有办法使用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   +

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

提前致谢。

问候, 查希尔


4174
2018-06-05 07:49


起源



答案:


看看手册页, -fdump-class-hierarchy 也许?


10
2018-06-05 08:07





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

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

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

对于ELF / DWARF, pahole 看起来是个好地方。


2
2018-06-07 03:04





C ++没有内省。一旦你的代码被编译,除了什么之外,关于类的每一条信息都会丢失 typeid 和 std::type_info 可以给你。


0
2018-06-05 07:59



我不认为他在谈论运行时内省,而是关于一些编译器选项能够告诉他编译器为其代码中的对象选择的内存布局。 - Matteo Italia


答案:


看看手册页, -fdump-class-hierarchy 也许?


10
2018-06-05 08:07





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

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

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

对于ELF / DWARF, pahole 看起来是个好地方。


2
2018-06-07 03:04





C ++没有内省。一旦你的代码被编译,除了什么之外,关于类的每一条信息都会丢失 typeid 和 std::type_info 可以给你。


0
2018-06-05 07:59



我不认为他在谈论运行时内省,而是关于一些编译器选项能够告诉他编译器为其代码中的对象选择的内存布局。 - Matteo Italia