如何解决为什么填充也放在聚合类型的末尾,而不是只放在成员之间?
我大致了解对齐并阅读了 cppreference's Objects and alignment 和 Wikipedia's Data structure alignment 。不过我还是有些疑惑。我主要对 C++ 感兴趣,但这个问题也适用于 C,因为它使用几乎相同的对齐规则。
我知道添加填充是为了提高数据访问的效率,因为在某些架构上,访问值是其大小倍数的地址会更快/更好(对齐)。
- 这是使用填充的唯一原因吗?
如果是这样,请考虑以下结构:
struct A {
int i;
char c;
};
struct B {
struct A a;
char d;
};
在我的架构 (x86_64) 上,编译器在 A
的末尾放置了 3 个字节的填充,以便 sizeof(A)==8
和 sizeof(A[2])==16
以及其他 3 个字节的填充在B
,所以 sizeof(B)==12
。
我知道将 A
对齐到 8 个字节可以更有效地将其存储在数组中。但是当 A
放在 B
中时,它似乎根本没有用。
如果到目前为止一切都是正确的,那么我想知道:
- 为什么将填充放置在类型的末尾,而不是将其限制在聚合类型(例如结构或数组)的元素之间,并且从不放在末尾?
我的意思的一个例子:如果编译器决定sizeof(A)==5
,sizeof(B)==6
,sizeof(A[2])==13
(元素之间的3个字节填充,但不是在结束)?
解决方法
考虑需要 int
4 字节对齐(或需要性能)的架构。现在考虑以下结构:
struct S {
int i;
char c;
}
可能在 i
和 c
之间不会有任何填充。但是现在想想如果你定义类似的东西会发生什么:
struct S array[10];
由于数组不允许在元素之间有任何填充,因此必须将此填充添加到 S
结构中 - 在它的末尾({{ 之后的 3 个字节) 1}}),保持c
的每个元素的正确对齐。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。