我正在阅读有关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。
答案 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)
。