【问题标题】:Retrieving data structure alignment information检索数据结构对齐信息
【发布时间】:2012-06-05 04:05:03
【问题描述】:

在大多数“普通”C/C++ 编译器(gcc/g++、普通智能手机编译器、Visual C++ 等)中是否有一种机制可以检索或生成data structure alignment 信息? (请注意,该术语包括对齐、填充和排列。)我希望无需在目标平台上运行任何 C/C++ 代码即可获得此信息。

(例如,这些数据是否可以通过 DWARF/DWARF2 在支持它的编译器上可靠地获得?)

更新:是的,可以将pahole 与 gcc 一起使用。 (我想知道这是否适用于 mingw32,如果可以,用于输出 DWARF2 数据的“-g”标志是否会修改代码生成。)不幸的是,gcc 不是我必须支持的唯一编译器。 (Visual C++ 是最有可能的第二个候选者。)

更新 2: 对于 Visual C++ this 看起来很有希望。我相信在 Visual C++ 和 g++ 之间,涵盖了 Windows、Linux、Mac OS X、iOS 和 Android NDK。

更新 3:仅供参考,我获取此类信息的主要原因是为了避免在 CPU 受限条件下为高性能加载而反序列化。如果您能想到比编写一些使用数据结构对齐信息的自定义工具更好的方法来实现这一点,请随时发布。我的投票手指很痒。

【问题讨论】:

  • 你在寻找__alignof__吗?
  • 如果您希望找到接近黑客攻击的解决方案,您可以使用offsetof,并将其提供给compile-time output solution,以生成逐个成员的偏移量和整体sizeof。跨度>
  • -g 根本不影响代码生成,它会导致编译器输出包含调试信息的附加链接器部分。
  • 你为什么不设计你的结构,使它们没有任何填充?这样,您还可以消除有关同一底层平台上不同 ABI 的任何问题(例如,如果一个 ABI 的 long long 对齐为 8 个字节,而另一个仅对齐为 4,这无关紧要,因为您确保它自然位于 8 个字节上无论如何边界)。
  • 这有点宏密集,但你可以使用未命名的联合来强制一个字段的大小,例如,两个 CPU 上的 sizeof(int): struct foo { union { char real_field; int real_fields_pad; }; }

标签: c++ c visual-c++ gcc data-structures


【解决方案1】:

我不确定其他编译器,但在 VC 中,您可以强制 struct 成员与 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

See MSDN for more information

【讨论】:

    猜你喜欢
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多