如果char []在结构__attribute __((aligned))内,是否保证char []的步幅为1?

时间:2018-12-08 06:36:25

标签: c struct sizeof memory-alignment stride

所以说我有一个看起来像这样的结构 (事实证明,这在现实世界中很普遍):

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.fnordfoo.quux上进行快速对齐的操作,否则就不会一开始就对齐。

1 个答案:

答案 0 :(得分:0)

按照标准的paragraph 6.2.5/20

  

数组类型描述了 连续分配的 非空集   具有特定成员对象类型的对象

(添加了强调。)因此,数组的元素在内存中始终是连续的。这是数组的定义特征之一。链接,存储类,其他数据结构的成员资格,数组本身或包含它的任何数据结构的对齐要求-这些都不影响数组元素的连续性。

数组的对齐要求通常是其元素类型的对齐要求的倍数,因此对齐数组本身也会对齐其所有元素。数组元素在任何情况下都不会单独对齐。