如果你想了解对象字段的内存布局(其他答案似乎暗示了这一点),那么有一个visual studio扩展可以做到这一点:Struct Layout by Ramon Viladomat(也可通过Github获得) 这将在您右键单击结构定义时添加一个上下文项,这将打开内存布局可视化工具窗口。 显示内容如下所示:
它有它的怪癖,我一直在努力在一些大型项目中正确设置它,但当它工作时,它非常有用。 在MS developer community forums上还有一个打开的特性请求票据,用于在默认情况下将特性添加到编辑器中。如果你想让它吸引眼球,请投赞成票。
7条答案
按热度按时间nbysray51#
对于Visual C++:
我终于设法挖出了(隐藏得很好!))MSVC++支持使用来自here和here的信息的未记录编译器标志。以下是:
(将
XXX
替换为类名)smdncfj32#
对于GCC编译的可执行文件, checkout Pahole。它将向您展示编译器如何布局您的结构/类,以及它们是否有“漏洞”。由于内存对齐规则,孔被填充。
pgccezyw3#
目标文件包含二进制数据-大多数编译器可以输出的唯一更高级别是汇编程序,所以如果你不能阅读,你就倒霉了。但是,请查看this question以了解这方面的更多信息。
qf9go6mv4#
你的问题有点令人困惑。
如果您想查看MSVC预处理的结果,可以使用
/E
、/P/
或/EP
。MSVC中有一个未记录的选项,用于显示结构和类的数据布局。我现在找不到它。
vaj7vani5#
可以使用Map文件检查二进制文件及其内容的布局。VC使用
/MAP
,gcc使用-Map
或--print-map
。gblwokeq6#
构造函数只是另一个函数(除非它是内联的)。对象文件包含了大量的链接器信息;所以你应该能够在.a文件中找到这个函数(尽管函数名会被修改)。
gmxoilav7#
如果你想了解对象字段的内存布局(其他答案似乎暗示了这一点),那么有一个visual studio扩展可以做到这一点:Struct Layout by Ramon Viladomat(也可通过Github获得)
这将在您右键单击结构定义时添加一个上下文项,这将打开内存布局可视化工具窗口。
显示内容如下所示:
它有它的怪癖,我一直在努力在一些大型项目中正确设置它,但当它工作时,它非常有用。
在MS developer community forums上还有一个打开的特性请求票据,用于在默认情况下将特性添加到编辑器中。如果你想让它吸引眼球,请投赞成票。