c++ - Itanium ABI 在多大程度上真正指定了填充和对齐?

标签 c++ gcc abi

有人告诉我:

[ABIs] guarantee the exact layout of the struct, byte offset of every member, which bits are used for bit fields, where and how much padding there is, etc...

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

是否 the Itanium ABI (GCC 使用的)实际上指定了这些东西(据 所知,it doesn't appear to 超出了指定范围)?

如果是这样,像 __attribute__ ((packed)) 这样的选项如何适应呢?他们最终是否会通过改变事物的对齐方式来破坏 ABI?

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

最佳答案

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

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

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

关于c++ - Itanium ABI 在多大程度上真正指定了填充和对齐?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13582153/

相关文章:

C++ 枚举类 quint64 类型

c - 将寄存器值读入 C 变量

c++ - 我可以扩展一个参数包并用它定义一个参数列表吗?

assembly - 为什么x86-64/AMD64 System V ABI要求16字节堆栈对齐?

c++ - 新的 C++/C 语法

c++ - TCPdump 在接收数据包时是否去除任何 header ?

gcc - 我可以告诉 gcc/ld 排除未使用的模块吗?

与 STL 相关的 C++ ABI 问题

android - 没有找到 void com.unity3d.player.UnityPlayer.nativeRestartActivityIndi​​cator() 的实现

c++ - 处理模板列表的元函数