有没有办法 - 比如查看使用gcc -E
进行预处理的结果 - 看看编译成目标文件后我的对象是什么样的?
我在谈论GCC,但包括MSVC的解决方案没问题。
答案 0 :(得分:22)
对于Visual C ++:
我终于设法使用来自here和here的信息来挖掘MSVC ++支持的(隐藏得很好!)未记录的编译器标志。他们在这里:
/d1reportSingleClassLayoutXXX
/d1reportAllClassLayout
(用类名替换XXX
)
答案 1 :(得分:6)
对于GCC编译的可执行文件,checkout Pahole。它将向您展示编译器如何布置您的结构/类以及它们中是否有“漏洞”。由于内存对齐规则,孔是填充的。
答案 2 :(得分:0)
目标文件包含二进制数据 - 大多数编译器可以输出的唯一更高级别是汇编程序,所以如果你不能读到你运气不好。但是,请查看this question了解此区域的更多信息。
答案 3 :(得分:0)
您可以使用地图文件检查二进制文件及其内容的布局。对VC使用/MAP
,为gcc使用-Map
或--print-map
。
答案 4 :(得分:0)
你的问题有点令人困惑。
如果您想查看使用MSVC进行预处理的结果,可以使用/E
,/P/
或/EP
。
MSVC中有一个未记录的选项,用于显示结构和类的数据布局。我现在无法找到它。
答案 5 :(得分:0)
构造函数只是另一个函数(除非它是内联的)。对象文件包含链接器的大量信息;所以你应该能够在.a文件中找到该函数(虽然函数名称会被破坏)。