C/C++ strict-aliasing

本文探讨了C/C++中的strict-aliasing规则,该规则影响编译器的代码优化。当开发者遵循此规则时,编译器可以进行更高效的优化。文章通过举例说明了不遵守规则可能导致的问题,并提到了如何通过-fno-strict-aliasing选项来规避潜在错误。同时,文章指出某些问题已在高版本编译器中得到修正,并提供了深入理解该规则的资源链接。
摘要由CSDN通过智能技术生成

最近发现了一个奇怪的编译参数-fno-strict-aliasing,好奇之下做了一点研究;

 

重点参考Understanding C/C++ Strict Aliasing

所谓的aliasing就是多个变量指向同一块内存,变量之间互为别名;

strict-aliasing是一种编译器希望开发者遵守的规则:虽然C/C++变量可以随便赋值(强制类型转换),但也请你们收敛一点,别太天马行空了;

如果开发者按照这个规则写代码了,编译器就可以做更好的代码优化,比如这个例子:

void foo(double *dblptr)
{
    anint = 1;
    *dblptr = 0;
    bar(anint);
}

如果开发者能够注意不要把int*转成double*,bar(anint)可以直接优化成bar(1);

但没有任何约束不允许这样做,因而编译器不敢做这样的优化,只能在bar(anint)将anint传入bar之前加一条汇编指令再读一下anint的值;

如果开发者确定自己的代码遵守这样的规则了,可以在编译时加一个优化参数-fstrict-aliasing,这个参数在gcc的-O2、-O3、-Os优化级别下都是默认开启的。

 

然后我对Understanding C/C++ Strict Aliasing文中的两个主要例子做了一下测试:

例子一:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值