【发布时间】:2012-11-27 10:26:36
【问题描述】:
有人告诉我:
[ABIs] 保证结构的精确布局、每个成员的字节偏移、哪些位用于位字段、填充的位置和数量等......
但我一直认为填充和对齐是未指定且不可靠的。
the Itanium ABI(GCC 使用)实际上是否指定了这些内容(据 我 所知,it doesn't appear to 超出了指定范围)?
如果是这样,__attribute__ ((packed)) 之类的选项如何适应它?他们最终是否会通过改变事物的对齐方式来破坏 ABI?
或者,正如引用者所暗示的那样,打包只是在工具链之间未指定,但实际上在某个 ABI 的使用中是可靠且可预测的?然后,再一次,像 __attribute__ ((packed)) 这样的东西是如何适应的?
【问题讨论】:
-
ABI 至少需要指定将来自不同编译器供应商的代码成功链接在一起所需的内容。这包括结构布局和填充以及对齐要求,因此编译器 B 可能依赖分配器 A 的正确对齐。告诉编译器更改打包行为会破坏 ABI,除非 ABI 还定义了新行为。
-
@bames53:哦,那很很有趣。以前没遇到过。当我有空闲的几个月时会读一读:P
-
@Sebby:是也不是。现有的答案很接近,但他们似乎误读了“我可以依赖 C++ 中的对齐和填充”的问题,这 不是 它是什么。我很清楚这些东西不是由 C++ 指定的,而是由单个 ABI 指定的。我不确定我关于这些 ABI 的问题是否已完全解决,尽管 Chawathe 的问题非常接近。