所以假设我有一个结构,看起来像这样(事实证明,在现实世界中很常见(:
struct foo {
char[24] bar;
uint32_t fnord;
uint32_t quux;
}__attribute__((aligned(4));
bar
的步幅是什么,即&bar[1] - &bar[0]
是什么,考虑到它在struct foo
中?这对sizeof(foo)
有影响,我很确定我想要它32,我还希望对foo.fnord
和foo.quux
进行良好的快速对齐操作,否则它一开始就不会对齐。
根据标准第6.2.5/20段,
数组类型描述了连续分配的非空的具有特定成员对象类型的对象
(添加了强调。(因此,数组的元素在内存中总是连续的。这是数组的定义特征之一。链接、存储类、在另一个数据结构中的成员资格、数组本身或包含它的任何数据结构的对齐要求——这些都不会影响数组元素的邻接性。
阵列的对齐要求通常是其元素类型的倍数,因此对齐阵列本身也会对齐其所有元素。在任何情况下,阵列元素都不受单独对齐的约束。