C编程语言的哪些实现违反了以下假设?

时间:2015-03-04 13:29:32

标签: c alignment padding abi

我试图编写一个可移植的函数,它根据格式字符串将二进制格式编组到结构中,与scanf完全不同。为此,我对我的代码运行的平台做了几个假设:

  1. structalign宏可移植地找到标量类型的对齐方式。

    #define structalign(t) offsetof (struct{char pad; t var;}, var)
    
  2. 在结构中,成员t的地址是下一个structalign(t)的倍数的免费地址。

  3. 其中structalign(t)是结构或联合或数组类型的t的值是structalign(m)的最大值,其中m是成员的类型t

  4. 这些假设在哪些平台上失败?它们是否都有C标准支持,特别是C99?我能做出更好的假设吗?

1 个答案:

答案 0 :(得分:1)

C99未解决对齐问题。它不支持您的任何假设。实现允许自由统治插入填充 - 或不 - 在成员之间和/或最后的struct表示中插入填充,但是他们认为合适。该标准为实现提供了足够的自由来满足其目标环境的对齐要求,但它没有提供支持用于探测对齐要求的任何行为的基础。特别是,它们是struct成员的偏移量与其类型对象的最佳对齐之间的 no 固有关系。

虽然您的代码在与许多实现一起使用时可能正确地确定了对齐,但在许多情况下,该代码或基于相同概念的任何代码在以导致所有struct表示形式的模式编译时肯定会失败包装没有填充。许多编译器都提供了这种模式作为选项,原则上可以是某些编译器的默认模式。

由于您可能要做的任何事情来评估数据类型对齐涉及实现定义和/或未指定的行为,我建议您将这些机制与主代码分开,而是将它们放在构建系统中(假设您正在使用一个自适应的多平台构建系统,如CMake或GNU Autotools)。