大多数“常见”的C/C++编译器(如gcc/g++、智能手机的编译器、Visual C++等)是否提供了一种机制来检索或生成数据结构对齐信息?(注意,该术语包括对齐、填充和排列。)我希望在目标平台上无需运行任何C/C++代码即可获取此信息。
(例如,是否可以通过支持DWARF/DWARF2的编译器可靠地获取这些数据?)
更新:是的,可以使用gcc中的pahole。 (我想知道这是否适用于mingw32,如果适用,'-g'标志用于输出DWARF2数据是否会修改代码生成。)不幸的是,gcc并不是我唯一需要支持的编译器。(Visual C++可能是第二个最有可能的选择。)
更新2:对于Visual C++,这个看起来很有前途。我相信在Visual C++和g++、Windows、Linux、Mac OS X、iOS和Android NDK之间都有覆盖。
(例如,是否可以通过支持DWARF/DWARF2的编译器可靠地获取这些数据?)
更新:是的,可以使用gcc中的pahole。 (我想知道这是否适用于mingw32,如果适用,'-g'标志用于输出DWARF2数据是否会修改代码生成。)不幸的是,gcc并不是我唯一需要支持的编译器。(Visual C++可能是第二个最有可能的选择。)
更新2:对于Visual C++,这个看起来很有前途。我相信在Visual C++和g++、Windows、Linux、Mac OS X、iOS和Android NDK之间都有覆盖。
更新3:顺便说一下,我获取这些信息的主要原因是为了在CPU负载条件下避免反序列化以实现高性能加载。如果你有其他更好的方法来实现这一点,而不是编写一些使用数据结构对齐信息的自定义工具,请随意发表。我已经按捺不住我的投票手指了。
十年后的更新4:我的一个朋友使用现代语言特性(C++20及以上)创建了一个C++库,以实现几乎跨平台的零指令可序列化结构:https://github.com/KaylinFinke/data_serialization/tree/main。这个库本来可以解决我当初的需求,所以我想在这里告诉其他人。
__alignof__
吗? - user703016sizeof
。 - Sergey Kalinichenko-g
完全不影响代码生成,它会让编译器输出额外的链接器部分,其中包含调试信息。 - caflong long
对齐到 8 字节,而另一个只对齐到 4 字节,那么也没关系,因为您已经确保它自然地位于 8 字节边界上)。 - R.. GitHub STOP HELPING ICE