我正在阅读有关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);
}



在上面的代码中,很明显sizeof(Foo)是16,但是其对齐方式是1,请参见代码的输出。

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

如果我只声明一个数组char arr[16];,也会发生同样的情况,那么alignof(arr)将为1。

最佳答案

注意:数据对齐已在this article中进行了详细说明。如果您想知道该术语的一般含义以及为什么它是一个重要问题,请阅读本文。
资格在C++中定义为实现定义的整数值,该整数值表示连续地址之间的字节数,在该地址处可以分配给定对象[6.11.1] Alignment
此外,对齐方式必须是2 [6.11.4] Alignment的非负整数幂。
当我们计算结构的对齐方式时,我们必须考虑另一个规则[6.11.5] Alignment:

它没有直接声明,但是这些规则意味着结构对齐必须至少与其最严格对齐的成员的对齐一样严格。它可以更大,但不一定必须是,通常不是。
因此,当确定OP的示例中的结构对齐方式时,该结构的对齐方式必须不少于其唯一成员类型char[16]的对齐方式。然后通过8.3.6 [expr.alignof]:
alignof(char[16])等于alignof(char),由于[6.11.6] Alignment,通常为1:

在此示例中:

struct Foo
{
    char c[16];
    double d;
};
doublechar具有更严格的对齐方式,因此alignof(Foo)等于alignof(double)

09-07 09:05