C++ 对齐和字长

C++ 对齐和字长,c++,c++11,memory,alignment,granularity,C++,C++11,Memory,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的倍数而不是8的倍数的地址,那么性能会因为多一次访问而降低,对吗 这是因为alig

我被对齐要求和字号弄糊涂了。我使用的是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的倍数而不是8的倍数的地址,那么性能会因为多一次访问而降低,对吗


这是因为
alignof()
提供了我们需要遵循的最低要求,而在这个特定示例中,8字节的对齐更适合于简单的内存性能权衡吗?

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

其中:

  • 所有对齐都是2的幂
  • 结构的对齐要求不小于其最对齐的子对象。(琐碎的)
  • 结构的大小是其对齐的倍数(也很简单,否则数组将不可能)
你的例子满足了所有这些要求。如果您愿意,您可以获得更强的对齐方式(C++11):

此外,仅仅因为处理器的位数是64,这并没有反映在大多数类型的更高对齐要求中,尽管更高的对齐数据可以具有更好的读/写性能


如果较弱的对齐意味着数据跨越更多缓存线,处理器必须获取更多缓存线,那么性能只会变得更差。

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

其中:

  • 所有对齐都是2的幂
  • 结构的对齐要求不小于其最对齐的子对象。(琐碎的)
  • 结构的大小是其对齐的倍数(也很简单,否则数组将不可能)
你的例子满足了所有这些要求。如果您愿意,您可以获得更强的对齐方式(C++11):

此外,仅仅因为处理器的位数是64,这并没有反映在大多数类型的更高对齐要求中,尽管更高的对齐数据可以具有更好的读/写性能


如果较弱的对齐意味着数据跨越更多缓存线,处理器必须获取更多缓存线,那么性能只会变得更差。

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

其中:

  • 所有对齐都是2的幂
  • 结构的对齐要求不小于其最对齐的子对象。(琐碎的)
  • 结构的大小是其对齐的倍数(也很简单,否则数组将不可能)
你的例子满足了所有这些要求。如果您愿意,您可以获得更强的对齐方式(C++11):

此外,仅仅因为处理器的位数是64,这并没有反映在大多数类型的更高对齐要求中,尽管更高的对齐数据可以具有更好的读/写性能


如果较弱的对齐意味着数据跨越更多缓存线,处理器必须获取更多缓存线,那么性能只会变得更差。

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

其中:

  • 所有对齐都是2的幂
  • 结构的对齐要求不小于其最对齐的子对象。(琐碎的)
  • 结构的大小是其对齐的倍数(也很简单,否则数组将不可能)
你的例子满足了所有这些要求。如果您愿意,您可以获得更强的对齐方式(C++11):

此外,仅仅因为处理器的位数是64,这并没有反映在大多数类型的更高对齐要求中,尽管更高的对齐数据可以具有更好的读/写性能


如果较弱的对齐意味着数据跨越更多缓存线,处理器必须获取更多缓存线,那么性能只会变得更差。

对齐要求是特定于平台的,但通常基元类型的最小对齐与其大小相同。处理器可以在任何32位边界上执行32位加载/存储操作,但64位加载或存储需要64位对齐


您的结构的对齐是4,因为其中没有任何内容需要8字节对齐。虽然它只保存5个字节的有意义数据,但它的大小被填充为8,这样在一个数组中,第二个和后续实例也将正确对齐。

对齐要求是特定于平台的,但通常基元类型的最小对齐与其大小相同。处理器可以在任何32位边界上执行32位加载/存储操作,但64位加载或存储需要64位对齐


您的结构的对齐是4,因为其中没有任何内容需要8字节对齐。虽然它只保存5个字节的有意义数据,但它的大小被填充为8,这样在一个数组中,第二个和后续实例也将正确对齐。

对齐要求是特定于平台的,但通常基元类型的最小对齐与其大小相同。处理器可以在任何32位边界上执行32位加载/存储操作,但64位加载或存储需要64位对齐


您的结构的对齐是4,因为其中没有任何内容需要8字节对齐。虽然它只保存5个字节的有意义数据,但它的大小被填充为8,这样在一个数组中,第二个和后续实例也将正确对齐。

对齐要求是特定于平台的,但通常基元类型的最小对齐与其大小相同。处理器可以在任何32位边界上执行32位加载/存储操作,但64位加载或存储需要64位对齐

您的结构的对齐是4,因为其中没有任何内容需要8字节对齐。虽然它只保存5字节有意义的数据,但它的大小被填充为8,因此
struct alignas(8) A {
    int a;
    char b;
}
struct A
{
    int a;     // 4 bytes
    char b;    // 1 byte
    // 3 bytes padding
}