C++ 对齐和字长
我被对齐要求和字号弄糊涂了。我使用的是64位处理器,所以字大小是8,这意味着分配的地址应该是8的倍数,对吗?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
但是,
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的幂
- 结构的对齐要求不小于其最对齐的子对象。(琐碎的)
- 结构的大小是其对齐的倍数(也很简单,否则数组将不可能)
如果较弱的对齐意味着数据跨越更多缓存线,处理器必须获取更多缓存线,那么性能只会变得更差。该标准在对齐和一般结构布局方面几乎没有保证 其中:
- 所有对齐都是2的幂
- 结构的对齐要求不小于其最对齐的子对象。(琐碎的)
- 结构的大小是其对齐的倍数(也很简单,否则数组将不可能)
如果较弱的对齐意味着数据跨越更多缓存线,处理器必须获取更多缓存线,那么性能只会变得更差。该标准在对齐和一般结构布局方面几乎没有保证 其中:
- 所有对齐都是2的幂
- 结构的对齐要求不小于其最对齐的子对象。(琐碎的)
- 结构的大小是其对齐的倍数(也很简单,否则数组将不可能)
如果较弱的对齐意味着数据跨越更多缓存线,处理器必须获取更多缓存线,那么性能只会变得更差。该标准在对齐和一般结构布局方面几乎没有保证 其中:
- 所有对齐都是2的幂
- 结构的对齐要求不小于其最对齐的子对象。(琐碎的)
- 结构的大小是其对齐的倍数(也很简单,否则数组将不可能)
如果较弱的对齐意味着数据跨越更多缓存线,处理器必须获取更多缓存线,那么性能只会变得更差。对齐要求是特定于平台的,但通常基元类型的最小对齐与其大小相同。处理器可以在任何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
}