【问题标题】:To what extent does the Itanium ABI really specify padding and alignment?Itanium ABI 在多大程度上真正指定了填充和对齐?
【发布时间】: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 的问题非常接近。

标签: c++ gcc abi


【解决方案1】:

填充和对齐未在 ISO 标准 C++ 规范中指定,因此不可靠。

在引文中使用“精确”一词是夸大其词。 Itanium ABI(GCC 使用)可以根据需要指定这些内容(在指定范围内),而不是总是和精确ly

假设预先确定的目标架构和环境,即使用工具链,打包实际上是可靠且可预测的。 ABI。当适用于工具链的所有目标特定细节都已预先确定时,__attribute__ ((packed)) 就像任何其他构造一样,都会生成可预测的输出,以使工具链正常工作。

【讨论】:

    【解决方案2】:

    您需要按照文档中引用的标准进行操作。

    英特尔System V ABI 规范中规定了大多数类型的大小和对齐方式;例如,long longlong double 类型的大小和对齐方式记录在 Unix System V 应用程序二进制接口,安腾处理器补充(编号 245370-001),表 3-1 其他基本数据类型

    要找到权威的标准副本有点困难,尤其是在没有真正的标准流程的情况下。包含 LP64 ABI 中所有类型的大小和对齐方式的一个很好的参考是 http://www.x86-64.org/documentation/abi.pdf,尽管它不包括 ILP32 ABI。

    __attribute__((packed)) 当然是 gcc 特定的,#pragma pack 对于 MSVC 也是如此。您也许可以使用编译器兼容性特性来获得跨编译器的结构的一致布局,但是仅仅因为实现了兼容性特性就假设行为是相同的并不是一个好主意;您应该测试大小和键偏移是否相同。

    【讨论】:

      猜你喜欢
      • 2020-07-26
      • 1970-01-01
      • 1970-01-01
      • 2013-02-19
      • 2010-12-13
      • 2016-09-18
      • 1970-01-01
      • 2017-11-10
      • 1970-01-01
      相关资源
      最近更新 更多