C/C++:是否使用比较结果作为 int 真的无分支?

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...) 是否有真正的标准保证这是无分支的?

fuz*_*fuz 6

x86 具有SETcc根据标志值将字节寄存器设置为 1 或 0 的指令族。这通常被编译器用来实现这种没有分支的代码。

如果你使用“天真的”方法

int imax(int a, int b) {
    return a > b ? a : b;
}
Run Code Online (Sandbox Code Playgroud)

编译器将使用CMOVcc(条件移动)指令族生成更高效的无分支代码。

ARM 能够有条件地执行每条指令,这使编译器能够有效地编译您的和原始实现,原始实现更快。

  • 换句话说:通过尝试手动优化代码,而不是尽可能编写可读和简单的代码,代码变得既丑陋又缓慢。 (3认同)