【发布时间】:2011-07-01 19:15:44
【问题描述】:
我们有一个用于错误检查的宏,如下所示:
#define CheckCondition( x ) \
if( x ) { \
//okay, do nothing \
} else { \
CallFunctionThatThrowsException(); \
}
通常条件必须是true,我们希望CPU分支预测总是选择这条路径,如果它恰好是false,我们并不真正关心错误预测——抛出异常无论如何,大量的堆栈平仓将花费一大笔钱。
根据 CPU 核心描述,分支预测将处理前向跳转和后向跳转略有不同(例如总是执行后向跳转而从不执行前向跳转),编译器可以通过生成正确的代码来改进分支预测提示 CPU 分支预测器。
gcc 似乎为此提供了likely and unlikely hints。 Visual C++ 中有类似的东西吗?可以用__assume keyword吗?
【问题讨论】:
-
阅读文档很明显
__assume不能使用,因为它使编译器完全跳过另一个分支。 -
听起来像是微优化
-
@VJo:嗯,有点。但其目的是更改一个宏并对所有使用它的代码产生影响。如果这能让我们在执行速度上稍微提高一点,那也还不错。
-
@VJo 如果您想节省微秒,那么微优化可能很重要。
-
仅供参考:这是一篇有趣的文章,分析了
__builtin_expect在GCC中的作用:blog.man7.org/2012/10/how-much-do-builtinexpect-likely-and.html
标签: c++ visual-c++ optimization compiler-construction compiler-optimization