【发布时间】:2014-01-31 22:39:27
【问题描述】:
我想知道标准对如何对齐和分配以下结构有何规定:
struct A {
uint8_t b[16];
};
我可以期望A 的大小为 16 字节,在数组中的 16 字节边界上对齐(@987654323@ 的大小等于16*n,例如没有填充)和@的地址987654325@ 将是b 的第一个元素?
为了缩小范围,我关注的平台是 x86/x64、ARM M、R、A 和 A50。
编辑:澄清 - “对齐”我的意思是编译器将如何对齐堆栈上数组中的对象,例如每个下一个元素是否会相隔 16 个字节,自然我不希望 malloc 与平台默认边界以外的任何内容对齐。
编辑 2:阅读答案后,我想问,我可以期望特定于平台的显式对齐内在函数在多大程度上起作用?
【问题讨论】:
-
结构A的地址总是它的第一个元素的地址。
-
是的,除了 16 字节对齐之外的所有内容,这是不保证的。它只是您平台的最小对齐方式,通常 32 位平台为 4 个字节,64 位平台为 8 个字节。
-
很有趣,看看你在感兴趣的平台上获得了什么大小
struct xx { uint8_t c; struct A d; uint8_t e; struct A f; uint8_t g[14];}。 48还是别的什么?
标签: c arrays struct alignment sizeof