C 编程语言的哪些实现违反了以下假设?
Which implementations of the C programming language violate the following assumptions?
我正在尝试编写一个可移植函数,根据与 scanf
完全不同的格式化字符串将二进制格式编组为结构。为此,我对平台做了一些假设,我的代码是 运行 on:
此 structalign
宏可移植地查找标量类型的对齐方式。
#define structalign(t) offsetof (struct{char pad; t var;}, var)
在一个结构中,成员t
的地址是下一个空闲地址,它是structalign(t)
的倍数。
其中t
为结构或联合或数组类型的structalign(t)
的值为structalign(m)
其中m
为类型的最大值t
.
的成员
这些假设在哪些平台上失败了?它们中的任何一个都得到 C 标准的支持,特别是 C99 吗?我可以做出更好的假设吗?
C99 未解决对齐问题。它不支持您的 any 假设。允许实现自由支配在成员 and/or 之间的 struct
表示中插入填充 - 或不插入填充,但是他们认为合适。该标准为实现提供了足够的自由来满足其目标环境的对齐要求,但它没有提供任何基础来支持旨在探测对齐要求的 any 行为。特别是,没有 struct
成员的偏移量与其类型对象的最佳对齐方式之间的内在关系。
虽然您的代码在与许多实现一起使用时可能会正确确定对齐方式,但在许多情况下,该代码或任何基于相同概念的代码在以导致所有 struct
的模式编译时肯定会失败没有填充的表示。这种模式被许多编译器作为一个选项提供,原则上可以成为某些编译器的默认模式。
由于您为评估数据类型对齐所做的任何事情都涉及实现定义的 and/or 未指定行为,我建议您将此类机制与主要代码分开,而是将它们放在您的构建系统中(假设您正在使用自适应多平台构建系统,例如 CMake 或 GNU Autotools)。
我正在尝试编写一个可移植函数,根据与 scanf
完全不同的格式化字符串将二进制格式编组为结构。为此,我对平台做了一些假设,我的代码是 运行 on:
此
structalign
宏可移植地查找标量类型的对齐方式。#define structalign(t) offsetof (struct{char pad; t var;}, var)
在一个结构中,成员
t
的地址是下一个空闲地址,它是structalign(t)
的倍数。其中
t
为结构或联合或数组类型的structalign(t)
的值为structalign(m)
其中m
为类型的最大值t
. 的成员
这些假设在哪些平台上失败了?它们中的任何一个都得到 C 标准的支持,特别是 C99 吗?我可以做出更好的假设吗?
C99 未解决对齐问题。它不支持您的 any 假设。允许实现自由支配在成员 and/or 之间的 struct
表示中插入填充 - 或不插入填充,但是他们认为合适。该标准为实现提供了足够的自由来满足其目标环境的对齐要求,但它没有提供任何基础来支持旨在探测对齐要求的 any 行为。特别是,没有 struct
成员的偏移量与其类型对象的最佳对齐方式之间的内在关系。
虽然您的代码在与许多实现一起使用时可能会正确确定对齐方式,但在许多情况下,该代码或任何基于相同概念的代码在以导致所有 struct
的模式编译时肯定会失败没有填充的表示。这种模式被许多编译器作为一个选项提供,原则上可以成为某些编译器的默认模式。
由于您为评估数据类型对齐所做的任何事情都涉及实现定义的 and/or 未指定行为,我建议您将此类机制与主要代码分开,而是将它们放在您的构建系统中(假设您正在使用自适应多平台构建系统,例如 CMake 或 GNU Autotools)。