重写if语句以避免分支是否值得?

Cha*_*ong 3 algorithm branch

最近我意识到我已经做了太多的分支而没有关心它对性能的负面影响,因此我决定尝试学习所有关于不分支的知识.这是一个更极端的情况,试图使代码尽可能少的分支.

因此对于代码

if(expression) 
  A = C;       //A and C have to be the same type here obviously
Run Code Online (Sandbox Code Playgroud)

表达式可以是A == B,或Q <= B,它可以是任何解析为true或false的东西,或者我想在结果为1或0时将其想象成

我想出了这个非分支版本

A += (expression)*(C-A);   //Edited with thanks
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,这是一个能够最大限度提高效率的好解决方案吗?如果是,为什么,如果不是为什么?

Lee*_*ker 6

取决于编译器,指令集,优化器等.当您使用布尔表达式作为int值时,例如,(A == B) * C编译器必须进行比较,并根据结果将某些寄存器设置为0或1.除了分支之外,某些指令集可能没有任何方法可以做到这一点.一般来说,最好编写简单,直接的代码并让优化器弄清楚它,或者找到一个不那么分支的不同算法.