在while循环中嵌套while循环和在while循环中嵌套if-else循环之间是否存在任何显着差异? (C ++)

时间:2009-11-28 21:42:01

标签: c++ loops performance

编辑:我忘了添加第二个代码的循环部分。

查看两种代码样式

while(some_loop_cont_val)
{
    while(pre_x is not done)
    {
        //do action pre_x
    }
    //do action x
}

while(some_loop_cont_val)
{
    if(pre_x is not done)
    {
        //do action pre_x
    }
    else
    {
        //do action x
    }
}

第一个循环执行pre_x(可能是迭代操作),然后是x,第二个循环执行pre_x的一部分,如果没有完成,则继续执行直到完成,然后执行x。所以两者都做pre_x然后做x。

我想知道两者之间是否存在任何差异,无论是在效率方面,还是在其他方面(例如:如果有一些微妙的影响,很少会出现,& c。),或者如果有的话是否有理由在特定情况下使用一个而不是另一个,或者只是一个偏好问题。

8 个答案:

答案 0 :(得分:4)

在第一个例子中,第二个while循环可能实际循环。

第二个示例有条件地提交两个不同的动作。

答案 1 :(得分:1)

    内部循环中的
  1. break语句不允许您退出外部循环。因此,您将错过break / continue语句引入的一些有用功能。比较:

    while(some_loop_cont_val) {
        if(some_det) {
            break;
        }
    }
    //"break" takes you here
    

    while(some_loop_cont_val){
        while(some_det) {
            break;
        }
      //"break" takes you here
    }
    
  2. 另一件事是“while”循环至少需要两次比较:在第一次迭代时输入它而不在第二次迭代中输入它。

答案 2 :(得分:0)

拜托,请不要担心这些事情的效率!!!

action代码必须几乎没有让您注意到差异。

如果几乎​​没有分析显示程序计数器在该循环中花费的时间超过10%,那么就担心它的效率。然后,如果你愿意,你可以展开循环或做其他聪明。

答案 3 :(得分:0)

要记住的重要一点是,机器代码级别仍然是某些描述的跳转语句。你唯一能做到的就是使用语言功能来解决其设计之外的其他问题。

在某些低级编程(驱动程序等)中,可能需要进行此优化 - 但我对此表示怀疑。如果你达到那个级别,那么用汇编程序编写东西或使用宏来隐藏歧义可能是一件好事。

答案 4 :(得分:0)

如果对代码进行适当的更改以使逻辑相等,由于cpu更好的分支预测,使用一个循环将更有效(一个循环比两个循环更容易预测 - 您可能会有更少的错误预测这样)

有关分支预测的更多信息:http://en.wikipedia.org/wiki/Branch_predictor

答案 5 :(得分:0)

如果内循环的条件保持为真,则当外循环的条件变为假时,第一个样式的内循环将继续迭代。

相反,无论if条件是否为真,if-branch都不能在外循环条件变为false时重复执行。

(并重复其他人所说的:if-else不是循环。就像while,它是一个控制结构,但它不是循环。)

答案 6 :(得分:0)

这两者的逻辑完全不同

如果some_loop_cont_val为真且操作pre_x 使some_loop_cont_val为false,只有您的第一个示例将执行操作x

答案 7 :(得分:-2)

效率和偏好是irellevent,两个代码片段在任何方面都不相同。 if-else 不是循环结构。

相关问题