12

我已被告知了:

[ABI] 保证结构的精确布局、每个成员的字节偏移、哪些位用于位字段、填充的位置和数量等......

但我一直认为填充和对齐是未指定且不可靠的。

Itanium ABI(GCC 使用)实际上是否指定了这些东西(据所知,它似乎没有超出指定范围)?

如果确实如此,那么诸如此类的选项如何__attribute__ ((packed))适应呢?他们最终会通过改变事物的对齐方式来破坏 ABI 吗?

或者,正如引用者所暗示的那样,只是在工具链之间进行未指定的打包,但实际上是可靠且可预测的在使用某个 ABI然后,再一次,像这样的东西是如何__attribute__ ((packed))适应的?

4

2 回答 2

2

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

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

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

于 2013-04-10T09:47:12.170 回答
1

您需要遵循通过引用并入的标准的文档。

大多数类型的大小和对齐方式都在 Intel System V ABI规范中指定;例如,long long类型long double的大小和对齐方式记录在Unix System V Application Binary Interface, Itanium Processor Supplement (no. 245370-001), table 3-1 Additional Fundamental Data Types中。

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

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

于 2012-11-27T10:39:28.900 回答