2014-10-06 50 views
1

这两个代码之间存在相当大的优化差异(在Java和/或C++中,当前,即使我猜它在每种语言中都是一样的)?还是仅仅是代码可读性问题?使用多个返回语句

int foo(...) { 
    if (cond) { 
     if (otherCondA) 
      return 1; 
     if (otherCondB) 
      return 2; 
     return 3; 
    } 
    int temp = /* context and/or param-dependent */; 
    if (otherCondA) 
     return 4 * temp; 
    if (otherCondB) 
     return 4/temp; 
    return 4 % temp; 
} 

int foo(...) { 
    int value = 0; 
    if (cond) { 
     if (otherCondA) 
      value = 1; 
     else if (otherCondB) 
      value = 2; 
     else value = 3; 
    } 
    else { 
     int temp = /* context and/or param-dependent */; 
     if (otherCondA) 
      value = 4 * temp; 
     else if (otherCondB) 
      value = 4/temp; 
     else 
      value = 4 % temp; 
    } 
    return value; 
} 

第一个是短,避免else语句的多个鳞状部,节约一个变量(或者至少看起来这样做),但我不知道它真的改变了一些东西...

+0

你不确定这是个好主意......为什么?你有没有任何理性的原因呢?或者你今天早上醒来就是这样吗?您是否尝试检查生成的代码或使用分析工具? – 2014-10-06 16:51:41

+0

许多人主张单一'返回',因为他们认为代码更容易通过。即使我遵循这个建议,当前提条件失败时,我也允许在函数前面提前返回。 – 2014-10-06 17:09:41

+0

经过几次测试之后,编译器只能优化MarkRansom谈到的多重返回语句的种类。在函数中间,优化非常差。 – 2014-10-06 17:28:19

回答

1

停止程序寻求更深入的GCC产生不同的汇编代码后,这里的结果:

的多个return语句中的“正常”的编写更高效,但带有-O_标志,余额变化为:

您越是优化代码,第一种方法的价值就越低。它使代码难以优化,因此请谨慎使用它。正如评论所说,在测试前提条件时,它在功能的前面使用时功能非常强大,但在函数的中间,这对编译器来说是一场噩梦。

0

当然,多重回报是可以接受的。 因为你可以尽快功能完成