检索数据结构对齐信息

4
大多数“常见”的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之间都有覆盖。

更新3:顺便说一下,我获取这些信息的主要原因是为了在CPU负载条件下避免反序列化以实现高性能加载。如果你有其他更好的方法来实现这一点,而不是编写一些使用数据结构对齐信息的自定义工具,请随意发表。我已经按捺不住我的投票手指了。

十年后的更新4:我的一个朋友使用现代语言特性(C++20及以上)创建了一个C++库,以实现几乎跨平台的零指令可序列化结构:https://github.com/KaylinFinke/data_serialization/tree/main。这个库本来可以解决我当初的需求,所以我想在这里告诉其他人。


2
你是在寻找 __alignof__ 吗? - user703016
2
如果你想要一些 hack 的解决方案,可以使用 offsetof 函数,并将其输入到一个 编译时输出的解决方案 中,以生成逐个成员的偏移量和整体 sizeof - Sergey Kalinichenko
1
-g完全不影响代码生成,它会让编译器输出额外的链接器部分,其中包含调试信息。 - caf
2
为什么不设计你的结构体,使它们没有任何填充呢?这样,您还可以消除在同一底层平台上使用不同 ABIs 的任何问题(例如,如果一个 ABI 将 long long 对齐到 8 字节,而另一个只对齐到 4 字节,那么也没关系,因为您已经确保它自然地位于 8 字节边界上)。 - R.. GitHub STOP HELPING ICE
1
虽然它有点宏密集,但您可以使用未命名联合来强制字段的大小为两个 CPU 的 sizeof(int):结构体 foo { 联合 { 字符 real_field; 整数 real_fiels_pad; }; } - benzaita
显示剩余6条评论
1个回答

0

我不确定其他编译器,但在 VC 中,你可以使用 pragma 强制结构体成员对齐。实际上,如果你正在编写使用结构体的 IPC 机制,那么应该在任何被两个进程都使用的声明周围以编程方式强制对齐。这样,如果任一应用程序偏离标准的结构体成员对齐,就可以消除潜在的错误。

#pragma pack(push, 1) // forces 1 byte alignment

typedef struct
{
    int sample;
    char sample2;
}FIVE_BYTES;

#pragma pack(pop) // returns to whatever alignment was in use prior to the push

请参阅MSDN获取更多信息


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接