对齐是对值的第一个字节可以存储在哪些存储器位置的限制。 (需要改进处理器上的性能并允许使用仅对具有特定对齐的数据起作用的某些指令,例如SSE需要对齐到16字节,而AVX到32字节)
16的对齐意味着是16的倍数的存储器地址是唯一有效的地址。
alignas
力对齐到所需的字节数(cppreference没有提到它,但我认为你只能对齐2的权力:1,2,4,8,16,32,64,128,…)
#include
#include
int main(){
alignas(16) int a[4];
alignas(1024) int b[4];
printf("%p\n",a);
printf("%p",b);
return 0;
}
示例输出:
0xbfa493e0
0xbfa49000 //note how many more "zeros" now.
//binary equivalent
1011 1111 1010 0100 1001 0011 1110 0000
1011 1111 1010 0100 1001 0000 0000 0000 //every zero is just a extra power of 2
其他关键字
alignof
非常方便,你不能做类似的东西
int a[4];
assert(a%16==0); //check if alignment is to 16 bytes: WRONG compiler error
但你可以做到
assert( alignof(a)==16);
assert( alignof(b)==1024);
注意,在现实中,这比简单的“%”(模数)操作更严格。事实上
我们知道对齐到1024字节的东西必须对齐到1,2,4,8字节
assert( alignof(b)==32); //fail.
因此,为了更精确,“alignof”返回2的最大幂,以使某事对齐。
另外alignof是一个很好的方法来提前知道基本数据类型的最小对齐要求(它可能返回1为字符,4为float等)
仍然合法:
alignas(alignof(float)) float SqDistance;
具有16的对齐的那些将被放置在是16的倍数的下一可用地址(可能存在来自最后使用的地址的隐式填充)