【问题标题】:Alignment of struct with explicit width members on different compilers结构与不同编译器上显式宽度成员的对齐
【发布时间】:2014-03-10 16:27:39
【问题描述】:

我想知道,如果手动填充结构,以便每个成员在其大小的倍数处对齐,并且所有对象都具有已知的显式宽度,那么我可以在多大程度上期望二进制布局完全符合“预期” /打算一个?也许有一些编译器特定的选项来确保布局与声明的完全一致?

IIRC C 标准不允许任何重新排序,因此只有最终的额外填充存在问题。如果结构根据自己的对齐规则进行填充,编译器是否需要添加填充?

【问题讨论】:

  • 请注意,类型的对齐要求可能与其大小不同。
  • @nos - 我的意思是只针对原语。结构是另一回事。
  • @nos - 你能举个例子吗?

标签: c struct offset member memory-address


【解决方案1】:

默认情况下,编译器将对齐到 32 位或 64 位。 是的,有一些编译器特定的选项可以将对齐设置为自定义值。

因此,如果您想控制结构字段的对齐方式,可以使用编译器标志或编译指示来实现。

使用 GCC 将是 -fpack-struct=[n]

在源代码中,您可以用#pagma pack#pagma push(pack) 包围结构的定义:

#pragma pack(push(n))
typedef struct my_struct {...} my_struct_t;
#pragma pack(pop)

GCC 文档: http://gcc.gnu.org/onlinedocs/gcc/Structure-Packing-Pragmas.html

MSDN 文档: http://msdn.microsoft.com/en-us/library/2e70t5y1.aspx

【讨论】:

    【解决方案2】:

    您可以在代码中指定强制填充,例如:__attribute__((aligned (16))); 而且我认为还有另一个属性名称packed 来指定您不希望编译器对齐您的结构。 欲了解更多信息,请参阅link

    【讨论】:

      【解决方案3】:

      (我可能是错的,但是)我不知道标准中 要求 填充最小的任何内容。鉴于此,编译器似乎有权在成员之间和结构末尾(但不是在开头)放置任意数量的填充,即使该填充不需要满足对齐要求。因此,不能保证手动填充到 32 位或 64 位以防止编译器添加填充,即使它可能适用于所有实际的编译器。

      正如其他人指出的那样,有一些特定于编译器(即非标准)的方法可以强制结构完全没有编译器提供的填充,但不能控制填充。

      即使您可以准确地指定填充,您仍然没有准确地定义结构内容,因为您还没有定义成员的表示形式(例如大端或小端整数),所以我不确定您从中获得什么,尤其是在需要便携性的情况下。您已经精确定义了成员的偏移量,但没有定义它们的表示。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-16
        • 2012-08-07
        • 2020-11-23
        • 2014-12-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多