c - 如果 char[] 位于 struct __attribute__((aligned)) 内部,则 char[] 的步长是否保证为 1?

标签 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.fnord 和 foo.quux 进行快速对齐操作,否则它一开始就不会对齐。

最佳答案

paragraph 6.2.5/20标准的,

An array type describes a contiguously allocated nonempty set of objects with a particular member object type

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

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

关于c - 如果 char[] 位于 struct __attribute__((aligned)) 内部,则 char[] 的步长是否保证为 1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53680196/

相关文章:

python - PyArrayObject 定义丢失

c - C 中的数组和循环

c - 如何在没有第 3 方软件的情况下生成唯一的、非连续的序列 key ?

c - 指向函数的指针,结构作为参数

c - 获取错误的字符串长度

c - 声明足够大的数组来容纳一个类型

c - 如果我使用 sizeof 和 size_t,我是否应该始终包含 stddef.h

c - 无符号位域类型 : int or unsigned int

c - 在哪里可以找到 -> 解引用运算符的源代码?

C# 结构的自动深拷贝