我对齐要求和单词大小感到困惑。我正在使用64位处理器,因此字大小为8,这意味着分配的地址应该是8的倍数,不是吗? 但是对于alignof运算符,我有不同的结果。
struct A
{
int a;
char b;
}
输出:
sizeof(A): 8
alignof(A): 4 // why?
相比之下,
sizeof(double): 8
alignof(double): 8
如果我碰巧提供的地址是A的4的倍数而不是A的8的倍数,那么性能会更低,因为一次访问是正确的吗?
是因为alignof()提供了我们需要遵循的最少要求,而在这个特定示例中对8个字节的对齐更好,只需简单的内存性能权衡吗?
答案 0 :(得分:1)
该标准在对齐和一般结构布局方面几乎没有保证。
其中:
你的例子完成了所有这些。如果你愿意,你可以获得更强的对齐(C ++ 11):
struct alignas(8) A {
int a;
char b;
}
另外,仅仅因为处理器的位数为64,这并没有反映在大多数类型的更高对齐要求中,尽管更强对齐的数据可以具有更好的读/写性能。
如果loer alignemnt意味着数据跨越更多缓存行而处理器必须获取更多缓存行,那么性能将会下降。
答案 1 :(得分:1)
对齐要求是特定于平台的,但通常原始类型的最小对齐与其大小相同。处理器可以在任何32位边界上执行32位加载/存储操作,但64位加载或存储需要64位对齐。
您的结构对齐是4,因为其中的任何内容都不需要8字节对齐。虽然它只保存5个字节的有意义数据,但它的大小填充为8,因此在数组中,第二个和后续实例也将正确对齐。
答案 2 :(得分:1)
某些硬件系统禁止未对齐的内存访问。这样做会导致异常。这在RISC处理器中很常见。
其他处理器受到性能影响。通常需要两个处理器周期来访问未对齐的数据。
上述结果的原因是您的编译器使用的是4字节的int(不是8字节)。
struct A
{
int a; // 4 bytes
char b; // 1 byte
// 3 bytes padding
}