0

Here is a fragment of code:

bool EqualsA(const Foo& a, const Foo& b)
{
    return a == b;
}

bool EqualsB(const Foo& a, const Foo& b)
{
    const bool result = a == b;

    return result;
}

int MethodA()
{
    return GetValue() * GetOtherValue();
}

int MethodB()
{
    const int result = GetValue() * GetOtherValue();

    return result;
}

I wanted to know if there is any difference in returning values in these two different ways (instant return or store result in a variable). I think that storing is better for debugging but is there any performance loss (I don't think there is) or any other pros and cons for using one of those.

4

3 回答 3

4

编译器可以自由地优化掉局部变量,因此性能将是相同的。

在许多代码分析工具中,这被标记为代码异味,我倾向于同意。可以使调试器查看堆栈上的返回值,因此局部变量不会购买任何东西。

于 2013-02-25T23:02:54.550 回答
3

operator ==在为类型对象选择的重载返回的值Foo是类型的合理假设下bool,一个体面的编译器会在使用大量优化选项时优化你的临时存储,因此对于性能来说,这并不重要

我的建议是选择使您的代码更具可读性或更便于维护或调试的形式。

于 2013-02-25T23:02:43.120 回答
1

几乎可以肯定没有区别。只要程序的行为与您编写的一样,编译器就可以对您的代码做任何喜欢的事情。所以任何好的编译器都会摆脱无意义的初始化。

但是,可能会出现无法使此初始化消失的情况。例如,如果用于通过引用返回类类型结果的operator*重载,则该类类型的构造函数可能会产生一些副作用。如果是这样,编译器就无法摆脱初始化,因为它改变了程序的可观察行为。GetValue() * GetOtherValue()const

operator*但是,如果按值返回,为什么不是这样呢?那么这将成为复制省略的候选者,并且编译器可以摆脱该构造,而不管它是否有副作用。

于 2013-02-25T23:02:23.150 回答