为什么char数组的alignof总是1?

时间:2017-03-01 05:24:32

标签: c++ arrays memory-alignment

我正在阅读有关C ++中对齐的内容,我不确定为什么仅包含char数组成员的类的对齐不是数组的sizeof,但结果是总是1.例如

#include <iostream>

struct Foo{char m_[16];}; // shouldn't this have a 16 byte alignment?!

int main()
{
    std::cout << sizeof(Foo) << " " << alignof(Foo);
}

Live on Coliru

在上面的代码中清楚sizeof(Foo)是16,但是它的对齐是1,请参阅代码的输出。

为什么alignof(Foo) 1在这种情况下? 请注意,如果我将char m_[16];替换为int m_;这样的基本类型,那么alignof(Foo)就会成为我所期望的,即sizeof(int)(在我的机器上这是4 )。

如果我只是声明一个数组char arr[16];,那么alignof(arr)将为1。

1 个答案:

答案 0 :(得分:10)

注意:数据对齐已在this article中详细说明。如果您想知道该术语的含义以及为什么这是一个重要的问题,请阅读本文。

Aligment在C ++中定义为实现定义的整数值,表示可以分配给定对象的连续地址之间的字节数[6.11.1] Alignment

此外,对齐必须是2 [6.11.4] Alignment的非负整数幂。

当我们计算结构的对齐时,我们必须考虑另一个规则[6.11.5] Alignment

  

对齐的订单从较弱更强更严格   比对。更严格的对齐具有更大的对齐值。 <强>一种   满足对齐要求的地址也满足任何要求   有效的对齐要求较弱。

没有直接说明,但这些规则意味着 struct alignment必须至少与其最严格对齐的成员的对齐一样严格。它可能更大,但它不一定是,通常也不是。

因此,当确定结构与OP示例的对齐时,结构的对齐必须不小于其唯一成员类型char[16]的对齐。然后是8.3.6 [expr.alignof]

  

当alignof应用于引用类型时,结果为   引用类型的对齐方式。 当alignof应用于数组时   类型,结果是元素类型的对齐

alignof(char[16])等于alignof(char)因为[6.11.6] Alignment而通常为1

  

(...)窄字符类型应具有最弱的对齐要求。

在这个例子中:

struct Foo
{
    char c[16];
    double d;
};

double的对齐方式比char更严格,因此alignof(Foo)等于alignof(double)