如何提示 Visual C++ 编译器优化器 if 语句的特定分支不太可能被执行?

问题描述 投票:0回答:2

我们有一个用于错误检查的宏,如下所示:

#define CheckCondition( x ) \
    if( x ) { \
    //okay, do nothing \
    } else { \
       CallFunctionThatThrowsException(); \
    }

通常条件必须是

true
并且我们希望 CPU 分支预测始终选择这条路径,如果它碰巧是
false
,我们并不真正关心错误预测 - 抛出异常和大量错误无论如何,堆栈展开将花费一大笔钱。

根据CPU硬核描述,分支预测对前向跳转和后向跳转的处理方式略有不同(例如总是执行后向跳转,而从不执行前向跳转),并且编译器可以通过生成给出正确提示的代码来改进分支预测。 CPU 分支预测器。

gcc 似乎有

likely
unlikely
提示
。 Visual C++中有类似的东西吗?可以使用
__assume
关键字
吗?

c++ optimization visual-c++ compiler-optimization
2个回答
11
投票

不幸的是,根据他们的开发者中心,不在 MSVC 中。

这非常令人沮丧,因为我们想在几种情况下使用它,其中等效的 GCC 内在函数在内部循环中为我们节省了关键的几微秒,但我们能得到的最接近的结果是交换 if 和 else 子句,以便更可能的情况是前向跳跃未采取的分支。


3
投票

启用配置文件引导优化。 编译器不仅会最大化分支预测,而且可能会完全移开冷代码。 这个频道 9 video 解释了各种优化。

© www.soinside.com 2019 - 2024. All rights reserved.