对齐和字大小

时间:2014-08-09 18:31:12

标签: memory c++11 alignment granularity

我对齐要求和单词大小感到困惑。我正在使用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个字节的对齐更好,只需简单的内存性能权衡吗?

3 个答案:

答案 0 :(得分:1)

该标准在对齐和一般结构布局方面几乎没有保证。

其中:

  • 所有路线都是2的力量。
  • 结构的对齐要求不比其最对齐的子对象小。 (简单)
  • 结构的大小是其对齐的倍数(也是微不足道的,否则数组是不可能的)

你的例子完成了所有这些。如果你愿意,你可以获得更强的对齐(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
}