Visual Studio C++中有无__restrict关键字生成汇编代码一致问题咨询
这个现象不代表编译器未响应__restrict关键字的作用,大概率是你的编译配置和代码场景的问题,常见原因如下:
- 未开启符合要求的优化等级:MSVC的
__restrict关键字仅在开启/O1//O2这类代码优化选项时生效,Debug模式、无优化配置下编译器不会做指针别名分析,加不加__restrict生成的汇编本来就完全一致。 - 当前代码场景下已加的
__restrict无额外优化空间:你只给a、b指针加了__restrict,但循环里用到的c、d没有该修饰,编译器仍然需要假设c、d可能存在内存重叠,不会因为a、b的__restrict就调整优化策略。 /LD编译动态库的保守策略影响:/LD用于生成动态链接库,MSVC对导出的函数默认会采用更保守的编译规则,避免跨模块调用的ABI兼容性问题,很多跨单元的激进优化不会触发,自然看不到__restrict带来的汇编差异。
你可以按以下步骤调整后重新测试:
- 编译时开启
/O2优化,搭配/Oi//Ot速度优化选项,关闭所有Debug相关编译开关 - 给
sum2函数的c、d指针也加上__restrict修饰 - 去掉
/LD参数,直接将三个文件编译为单个可执行文件测试 - 如果必须测试动态库场景,给
sum2加上__declspec(noinline)避免内联消除差异,同时开启/LTCG全程序优化选项
内容的提问来源于stack exchange,提问作者Ehsan Sharifi Esfahani
相关产品推荐
相关产品推荐

