首页 > 解决方案 > 为什么填充也放在聚合类型的末尾,而不仅仅是成员之间?

问题描述

我大致了解 Alignment 并阅读了cppreference 的 Objects and alignment Wikipedia 的 Data structure alignment 。不过我还是有些疑惑。我主要对 C++ 感兴趣,但这个问题也适用于 C,因为它使用几乎相同的对齐规则。

我知道添加填充是为了提高数据访问的效率,因为在某些体系结构上,访问地址倍数的值会更快/更好(对齐)。

如果是这样,请考虑以下结构:

struct A {
  int i;
  char c;
};
struct B {
  struct A a;
  char d;
};

在我的体系结构 (x86_64) 上,编译器将 3 个字节的填充放在Aso thatsizeof(A)==8和的末尾,并将其他 3 个字节的填充放在, sosizeof(A[2])==16的末尾。Bsizeof(B)==12

我知道对齐A到 8 个字节可以更有效地将其存储在数组中。但它似乎一点用都没有,什么时候A放在里面B

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

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

标签: c++cmemory-alignment

解决方案


int考虑一个需要 4 字节对齐(或性能需要)的架构。现在考虑以下结构:

struct S {
    int i;
    char c;
}

和之间可能不会有任何填充。但是现在想想如果你定义类似的东西会发生什么:ic

struct S array[10];

由于数组不允许在元素之间有任何填充,因此必须将此填充添加到S结构中 - 在结构的末尾(在 之后 3 个字节c),以保持.array


推荐阅读