为什么填充也放在聚合类型的末尾,而不仅仅放在成员之间



我大致了解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)==8sizeof(A[2])==16,在B的末尾放置其他3个字节,使sizeof(B)==12

我知道将A与8字节对齐可以使它在数组中的存储效率更高。但当A被放置在B内部时,它似乎根本没有用处。

如果到目前为止一切都是正确的,那么我想知道:

  • 为什么在类型的末尾放置填充,而不是将其限制在聚合类型(例如结构或数组(的元素之间,而从不在末尾

我的意思是:如果编译器决定sizeof(A)==5sizeof(B)==6sizeof(A[2])==13(元素之间有3个字节的填充,但不是在末尾(,那不是更好吗?

考虑一个需要int4字节对齐(或需要性能(的体系结构。现在考虑以下结构:

struct S {
int i;
char c;
}

ic之间可能不会有任何填充。但现在想想,如果你定义了这样的东西,会发生什么:

struct S array[10];

由于数组不允许在元素之间有任何填充,因此必须将此填充添加到S结构的末尾(c之后的3个字节(,以确保array的每个元素的正确对齐。

最新更新