我大致了解Alignment,并且已经阅读了cppreference的Objects和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
,在B
的末尾放置其他3个字节,使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
结构的末尾(c
之后的3个字节(,以确保array
的每个元素的正确对齐。