如何让C编译器在返回值处理上获得优化自由度
如何让C编译器在返回值处理上获得优化自由度
咱先来看个实际例子,我写了这么一个C语言的整数比较函数:
i64 my_comparator1(i64 x, i64 y) { if (x > y) { return 1; } if (x < y) { return -1; } return 0; }
这个函数逻辑很直白,就是根据两个64位整数的大小关系返回1、-1或者0。但如果我手里攥着一些编译器不知道的参数“内幕消息”——比如我能确定传入的x一定不会超过100——那就能用__builtin_unreachable这个编译器内置函数,给编译器透个底,帮它在返回值处理上拿到更多优化空间。
比如我可以把函数改成这样(注:原代码片段存在截断,这里基于逻辑补全示意):
i64 my_comparator2(i64 x, i64 y) { // 先校验我们已知的约束条件,不满足就标记为绝对不会走到的分支 if (!(x <= 100)) { __builtin_unreachable(); } // 保留原有的比较逻辑 if (x > y) { return 1; } if (x < y) { return -1; } return 0; }
为啥这招管用呢?因为__builtin_unreachable相当于给编译器递了个话:“这个分支的代码绝对不可能被执行到,你完全不用为它做任何冗余处理”。编译器拿到这个信息后,就能放心地删掉一些不必要的边界检查,甚至调整返回值的生成逻辑,让最终的机器码更精简、运行更快。
说白了,就是你把自己掌握的额外参数约束信息主动告诉编译器,它就能放开手脚,在返回值处理和整体代码优化上获得更大的自由度。
备注:内容来源于stack exchange,提问作者KAction
相关产品推荐
相关产品推荐

