![]() |
1
30
不,数组元素之间永远不会有填充。这是特别不允许的。c99标准调用数组类型“数组类型描述了一组连续分配的非空对象…”。相比之下,结构是“顺序的”,而不是“连续的”分配。 一个结构中的数组前后可能有填充物;这完全是另一种动物。编译器可能这样做是为了帮助结构的对齐,但是C标准没有对此做任何说明。 |
![]() |
2
8
小心点。填充可以添加到结构的末尾,但不会在问题中所述的数组元素之间添加。数组始终引用连续的内存,尽管一个结构数组可能在每个元素中添加了填充,作为结构本身的一部分。
在您的示例中,
|
![]() |
3
3
这是关于 为什么? 结构可能需要在其成员之间填充,甚至在其最后一个成员之后填充,以及数组不填充的原因:
不同的类型可能有不同的对齐要求。有些类型需要在单词边界上对齐,另一些类型需要在双甚至四个单词边界上对齐。为了实现这一点,结构的成员之间可以包含填充字节。可能需要尾随填充字节,因为直接位于结构的内存位置也必须符合结构的对齐要求,即如果
生成指向的有效指针
由于数组的每个“成员”都有相同的对齐要求,因此没有理由引入填充。这对于包含在结构中的数组也适用:如果数组的第一个元素正确对齐,那么下面的所有元素也是如此。 |
![]() |
4
1
是的,差不多。变量通常与某些边界对齐,这取决于变量。举个例子:
在我的系统上,double和char分别是8和1字节。总计9。然而,这个结构将是16个字节,因此双精度数将始终是8字节对齐的。如果我刚刚使用了ints、chars等,那么对齐方式可能是1、2、4或8。
对于T型,
通常,这完全依赖于编译器和体系结构。实际上,这并不重要。 |
![]() |
5
0
考虑:
假设短裤是16位的,而你是32位的,那么尺寸会 可能 为8字节,因为每个结构成员倾向于对齐一个单词(在本例中为32位)边界。我之所以说“可能”,是因为它是特定于实现的行为,可以通过编译器标志等来改变。 值得强调的是,这是C标准不一定定义的实现行为。很像短裤、英特和多头的尺寸(C标准简单地说短裤不会比英特大,而多头也不会比英特小,最终可以是16/32/32、16/32/64、32/32/64或其他一些配置)。 |
![]() |
Aleph · 如何使这篇文章连贯一致?[副本] 7 月前 |
![]() |
fghoussen · 在C结构体中,为什么打包、对齐似乎会进行填充? 11 月前 |
![]() |
BENG · 协调C++和Objective-C中结构的填充 1 年前 |
![]() |
JTA1618 · 如何按组将可变数量的空白行附加到数据帧? 1 年前 |
![]() |
JTA1618 · 如何在python中填充嵌套列表? 1 年前 |
|
user7907740 · 如何使填充响应 7 年前 |
![]() |
J.Doe · 添加可能包含“None”项的数组 7 年前 |