【发布时间】:2015-11-13 00:29:26
【问题描述】:
根据Wikipedia:
最后一个成员被填充所需的字节数,因此结构的总大小应该是任何结构成员的最大对齐方式的倍数
在我的理解中,它的意思如下:
struct A {
char *p; // 8 bytes
char c; // 1 byte
};
struct B {
struct A a; // 16 bytes
char d; // 1 bytes
};
struct A 的大小为 16 字节,struct B 的大小为 24 字节。
常见的解释是A 的数组应该在数组的地址加上索引乘以A 的大小来访问其元素。
但我不明白为什么会这样。为什么我们不能说 A 的大小为 9 和 B 的大小为 10(均 8 字节对齐),并在索引数组时使用特殊的“数组存储”大小?
当然,我们仍然会以与它们的对齐方式兼容的方式将这些类型存储在数组中(使用 16 个字节来存储每个 B 元素)。然后,我们只需考虑它们的对齐方式来计算元素地址,而不是单独考虑它们的大小(编译器可以静态地做到这一点)。
例如,我们可以在 B 的 1Kb 字节数组中存储 64 个对象,而不仅仅是 42 个。
【问题讨论】:
-
优化通常,在某些平台上读取 CPU 本机字边界上的数据可能比读取未对齐的数据更快(例如,如果数据未对齐,则必须读取两个单词并屏蔽想要的单词)。
-
换一种说法,这是一个软件规范,不是为了软件的直接利益。相反,它是与硬件合作,在大多数情况下,这种对齐方式要么更好,要么在某些极端情况下,如果在没有这种对齐的情况下使用会崩溃(抛出软件必须处理的硬件异常或崩溃)。
-
请注意,我从不谈论不尊重对齐约束。
-
如果不能保证
sizeof(A)的值是相同的,无论对象是在一个数组中,在另一个struct中,还是它本身,我可以看到指针运算和分配内存时的问题使用malloc。
标签: c size padding memory-alignment