从同一个bool c ++中获得两个if语句的最佳实践

时间:2012-07-19 11:09:00

标签: c++ if-statement

我有一个if语句,[显然]只在条件为真时运行。在这个if语句之后,有一些代码应该总是运行,之后是另一个应该在与第一个条件相同的条件下运行的if语句。

中间的代码是使用堆栈的特定元素执行操作,任何一方的ifs分别在操作之前和之后执行堆栈上的push / pop。

所以逻辑是这样的:

  1. 我需要推动堆栈吗?是/否
  2. 在堆栈顶部执行操作
  3. 堆栈被推了? (如果是,则弹出)
  4. 第1项和第3项的条件相同。

    这是我在c ++

    中首次编写的代码
    #include <stdio.h>
    #include <stdlib.h>
    
    int somefunction(){
        return rand() % 3 + 1; //return a random number from 1 to 3
    }
    
    int ret = 0;
    
    
    //:::::::::::::::::::::::::::::::::::::::
    //  Option 1 Start
    //:::::::::::::::::::::::::::::::::::::::
    int main(){
        bool run = (ret = somefunction()) == 1; //if the return of the function is 1
        run = (run || (ret == 2));              //or the return of the function is 2
        if (run){                               //execute this if block
            //conditional code
            if (ret == 1){
                //more conditional code
            }
        }
            //unconditional code
        if (run){
            //even more conditional code
        }
    }
    //:::::::::::::::::::::::::::::::::::::::
    //  Option 1 End
    //:::::::::::::::::::::::::::::::::::::::
    

    写完这篇文章后,我认为这样做可能更有效:

    //:::::::::::::::::::::::::::::::::::::::
    //  Option 2 Start
    //:::::::::::::::::::::::::::::::::::::::
    int main(){
        bool run;
        if (run=(((ret = somefunction()) == 1)||ret == 2)){ //if the return of the function is 1 or 2 then execute this if block
            //conditional code
            if (ret == 1){
                //more conditional code
            }
        }
        //unconditional code
        if (run){
            //even more conditional code
        }
    }
    //:::::::::::::::::::::::::::::::::::::::
    //  Option 2 End
    //:::::::::::::::::::::::::::::::::::::::
    

    我更喜欢第一种可读性方法,因为它被分成几行,而第二种方法在同一行中有两个赋值(=)和两个比较(==)。 我想知道使用第二种方法是否更好(出于效率或可执行文件大小的原因),或者是否有比两者更好的方法。

    在任何人说它只会产生几乎无法估量的差异之前,这是一个巨大的循环,必须在1/50秒内运行数千次,所以我希望节省尽可能多的时间。

4 个答案:

答案 0 :(得分:5)

性能不应该是您关注的问题:现代编译器通常足够聪明,可以在任何情况下优化代码。如果代码基本上做同样的事情,结果将是相同的。

因此,您应该更喜欢更易读的变体(因此可以更好地维护)。

我会写这样的东西:

ret = somefunction();
// I don't know what is the semantics of ret == 1, so let's imagine some
bool operationIsPush = (ret == 1);
bool operationIsOnTop = (ret == 2);

if (operationIsPush || operationIsOnTop)
{
    //conditional code
}

if (operationIsPush)
{
    //more conditional code
}

//unconditional code

if (operationIsPush || operationIsOnTop)
{
    // ...
}

答案 1 :(得分:1)

我相信这里的表现没有差别。第一个原因是您的编译器可能会在每种情况下优化代码。第二个是你只是改变操作发生的地方(比如“我做A-> B-> C或A-> C-> B”),而不是操作量,所以它总是相同数量的计算(1个函数调用,几个==等等)。

但考虑到这一点 (run=(((ret = somefunction()) == 1)||ret == 2)) 很难读懂。

答案 2 :(得分:1)

正确性比你是否将两个操作分配给一个bool(编译器可能会做的那样)更重要。

要推送/弹出堆栈,您应该使用scopeguard(原始文章here)。这将确保如果某些东西抛出“无条件位”,这是您从未真正知道的,那么它仍然可以正常运行。否则你会有一个惊喜(一个堆叠,或溢出)。

答案 3 :(得分:0)

如果您可以将“if-else”拆分为不同的巨大循环,那么它会更快

而不是

loop {  if_1  {some work}    if_2 {some other work}   }

你可以

if_1 { loop {work }}    if_2 {loop{same work}}

更为极端的是,如果你能分开最内在的“if”句子,你就可以得到10-20(取决于你的情况)明显的大循环,运行速度快x2 x3(如果它是“如果”慢的话)