可能/不太可能等同于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第二次遇到分支,它将使用其统计数据而不是静态提示。