我对__builtin_expect
应该是一个规范的案例,但我似乎无法使其发挥作用,我正在寻找有关如何最好地利用该技术的任何建议。
我有一个
形式的功能void function() {
// Do some stuff
if (__builtin_expect((cond1),0)) {
// Do something expensive
}
if (__builtin_expect((cond2),0)) {
// Do something expensive
}
if (__builtin_expect((cond3),0)) {
// Do something expensive
}
}
其中// Do something expensive
指的是堆栈扩展的内存分配,复制和释放。现在cond1
,cond2
和cond3
非常罕见,理想情况下只在第一次调用函数时,我希望__builtin_expect
能确保分支得到适当优化。
不幸的是,在if语句中使用非常重要的代码会大大减慢我的代码,即使使用__builtin_expect
也是如此,即使条件在执行期间永远不是真的。我错误地使用了__builtin_expect
吗?是否有很少的优化空间,因为语句是在函数的末尾?我已尝试将// Do something expensive
代码包装在单独的函数及其各种排列中,但也没有成功。
如果它是相关的我在i7上使用clang 3.4。
感谢您的帮助。