if-else样式和优化

时间:2016-05-27 23:02:50

标签: c++ if-statement optimization

如果某个函数的行为取决于一系列条件,则可以使用不同的if-return块或一系列if-else块来计算它。示例计算模式:

void f(params) // isolated if-blocks
{
    if (cond1) {
       // computational steps
       return;
    }

    if (cond2) {
       // computational steps
       return;
    }

    // computational steps of last case
 }

 void f() // unique if-else block
 {
    if (cond1) {
       // computation
    } else if (cond2) {
       // computation
    } else { // last condition
       // computation
    }
 }

我会说第一个总是更具可读性,但我不知道第二个是否最好来自设计(易于维护/错误)或性能(分支预测/编译器优化)的观点。

这两种方法的优点和缺点是什么?我没有考虑过其他什么事情?

3 个答案:

答案 0 :(得分:6)

如果"计算步骤"适当长(有时这根本不需要很长),然后很难在视觉上确定有三个独立的块,每个块都有一个早期的返回。有人可能错误地推断所有三个块都可以在同一个函数调用中运行。

第二版明确表示只能执行一条路径,我相信它的阅读和维护更清晰。

答案 1 :(得分:1)

已经观察到,当使用if-then-else时,复杂的逻辑可以被绊倒,而使用许多if-then直接使用。但是之前的帖子是正确的,这应该没关系,只要所有标准对于每个elseif或else语句都是唯一的。

然而,在一个语句(AndAlso,OrElse,括号等)中混合了大量参数和众多逻辑时,可能会出现特殊情况,并且您无法使用elseif枚举所有这些参数,否则 - 和 - 你可以,例如只想使用20种可能的参数组合中的2种情况。在这里,您肯定只需要使用2个if-then语句。

答案 2 :(得分:0)

如果您将计算步骤放在他们自己的函数中,您的函数将如下所示:

void f(params) // isolated if-blocks
{
   if (cond1) {
      function_cond1();
      return;
   }

   if (cond2) {
      function_cond2();
      return;
   }

   // computational steps of last case
   function_default();
}
void f() // unique if-else block
{
   if (cond1) {
      function_cond1();
   } else if (cond2) {
      function_cond2();
   } else { // last condition
      function_default();
   }
}

当你这样做时,两种风格之间的差异并没有太大的区别。这两种方法都很容易理解。

就个人而言,我更喜欢第一种风格,因为它可以清楚地分开三个街区/条件,但我发现第二种方法根本没有。