【发布时间】:2015-04-08 16:48:11
【问题描述】:
假设我有一些函数IsTrue(),它返回一个bool。如果程序员决定IsTrue() 通常会返回true,她可能会使用GCC 的__builtin_expect 或类似的方法来加速那些典型情况下的指令。
举以下2个例子:
// example 1
const bool result = IsTrue();
if (__builtin_expect(result, true))
// do something
;
// example 2
if (__builtin_expect(IsTrue(), true))
// do something
;
假设IsTrue 是不平凡的,它们之间有什么区别吗?将IsTrue() 放在__builtin_expect 参数列表中是否会导致在IsTrue 的结果已知之前评估指令缓存,或者分支预测是否仅适用于之后 IsTrue的结果是计算出来的?
【问题讨论】:
-
附带说明:如果谓词是 complex(可能涉及其自己的分支),则原始分支的相对成本无论如何都会减少。
-
我认为您混淆了 CPU 上的分支预测和编译器上的预测提示。分支预测仅在 CPU 看到分支指令并决定我们是否应该实际接受它时才会发生。预测提示告诉编译器有一个理想的分支代码安排,以便在运行时更好地预测行为。您的代码示例实际上与在这两种情况下编译器必须评估函数并将结果存储在某种变量中相同。第一个示例只是使其明确。
标签: c++ branch-prediction