gal*_*tte 4 c++ comparison branch-prediction
我在很多 SO 答案中都看到过这种代码:
template <typename T>
inline T imax (T a, T b)
{
return (a > b) * a + (a <= b) * b;
}
Run Code Online (Sandbox Code Playgroud)
哪里有作者说这个无分支。
但这在当前架构上真的是无分支的吗?(x86, ARM...) 是否有真正的标准保证这是无分支的?
x86 具有SETcc根据标志值将字节寄存器设置为 1 或 0 的指令族。这通常被编译器用来实现这种没有分支的代码。
如果你使用“天真的”方法
int imax(int a, int b) {
return a > b ? a : b;
}
Run Code Online (Sandbox Code Playgroud)
编译器将使用CMOVcc(条件移动)指令族生成更高效的无分支代码。
ARM 能够有条件地执行每条指令,这使编译器能够有效地编译您的和原始实现,原始实现更快。
| 归档时间: |
|
| 查看次数: |
1010 次 |
| 最近记录: |