可能/不太可能等同于MSVC

GCC编译器支持用于定义可能的和不太可能的macros的__builtin_expect语句。

例如。

#define likely(expr) __builtin_expect(!(expr), 0) #define unlikely(expr) __builtin_expect((expr), 0) 

是否有与Microsoft Visual C编译器等效的语句?

我说只是踢

没什么东西跟它一样了。 有__assume() ,但不使用它,它是一种不同的优化器指令。

实际上,gnu内build函数包含在macros中的原因是,如果__GNUC__未定义,您可以自动将其除去。 对于这些macros,没有什么必要,我打赌你不会注意到运行时间的差异。

概要

只要摆脱(null out) *likely在非GNU。 你不会错过的。

根据drepper/cpumemory.pdf (第57页),即使CPU预测dynamic正确,使用静态分支预测仍然有意义。 其原因是如果静态预测正确的话,L1icaching将被更有效地使用。

__assume应该是相似的。

但是,如果您想要做到这一点,则应该使用configuration文件引导式优化而不是静态提示。

根据英特尔防止误预测的分支和环路重组 :

为了有效地编写代码以利用这些规则,在编写if-else或switch语句时,首先检查最常见的情况,然后逐步向最不常见的方向发展。

不幸的是,你不能写这样的东西

 #define if_unlikely(cond) if (!(cond)); else 

因为VS10的MSVC优化器忽略了这种“提示”。

因为我更喜欢在代码中处理错误,所以我似乎编写效率较低的代码。 幸运的是,CPU第二次遇到分支,它将使用其统计数据而不是静态提示。