【发布时间】:2017-05-04 15:12:00
【问题描述】:
对于this code:
struct S { unsigned char ch[2]; };
int main(void)
{
_Static_assert( sizeof(struct S) == 2, "size was not 2");
}
使用带有 ABI apcs-gnu(又名 OABI 或 EABI 版本 0)的 ARM 的 GCC(各种版本),我得到断言失败。原来结构的大小是4。
我可以使用__attribute__((packed)) 解决这个问题;但我的问题是:
- 使这个结构大小
4的基本原理是什么? - 是否有任何文档指定此 ABI 中结构的布局?
在 ARM 网站上,我找到了 aapcs(EABI 版本 5)的文档,该文档确实将此结构指定为大小为 2;但我找不到任何关于 apcs-gnu 的信息。
【问题讨论】:
-
填充不是 ABI 的一部分。由于现代总线架构,让每条数据都与 4 字节地址对齐可能非常有意义。
-
不确定您的具体平台,但通常以 4 个字节访问内存会生成更快的代码,所以也许这就是原因。
-
为什么你的代码要求这个结构的大小为 2 个字节?
-
@EugeneSh。结构对齐规则总是在 ABI 中定义,否则将无法在 asm 中开发兼容的程序。
-
@BrianSidebotham 这是根据APCS ABI的结构大小。