编译对象的布局

有没有办法 – 就像用gcc -E查看预处理的结果一样,看看我的对象在编译成目标文件后会是什么样子?

我说的是GCC,但包括MSVC在内的解决方案没问题。

对于Visual C ++:

我终于设法使用来自这里和这里的信息来挖掘MSVC ++支持的(隐藏得很好!)未记录的编译器标志。 他们来了:

 /d1reportSingleClassLayoutXXX /d1reportAllClassLayout 

(用类名替换XXX

对于GCC编译的可执行文件,签出Pahole 。 它将向您展示编译器如何布置您的结构/类以及它们中是否有“漏洞”。 由于内存对齐规则,孔是填充的。

对象文件包含二进制数据 – 大多数编译器可以输出的唯一更高级别是汇编程序,因此如果您无法读取,那么您运气不好。 但是,请查看此问题以获取此领域的更多信息。

你的问题有点令人困惑。

如果要查看使用MSVC进行预处理的结果,可以使用/E/P//EP

在MSVC中有一个未记录的选项来显示结构和类的数据布局。 我现在很难找到它。

您可以使用映射文件检查二进制文件及其内容的布局。 对VC和-Map使用/MAP或为gcc使用--print-map

构造函数只是另一个函数(除非它是内联的)。 对象文件包含链接器的大量信息; 所以你应该能够在.a文件中找到该函数(虽然函数名称会被破坏)。