alignas的使用C语言,c++ 内存对齐:如何使用alignof/alignas?

对齐是对值的第一个字节可以存储在哪些存储器位置的限制。 (需要改进处理器上的性能并允许使用仅对具有特定对齐的数据起作用的某些指令,例如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的倍数的下一可用地址(可能存在来自最后使用的地址的隐式填充)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值