在变量中存储返回前的值

Storing value before return in a variable

提问人:Pavel Dubsky 提问时间:2/26/2013 最后编辑:Pavel Dubsky 更新时间:5/15/2014 访问量:508

问:

下面是一段代码:

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;
}

我想知道以这两种不同的方式返回值(即时返回或将结果存储在变量中)是否有任何区别。我认为存储更适合调试,但是使用其中之一是否有任何性能损失(我认为没有)或任何其他利弊。

C++ 编码样式 返回 返回值

评论

0赞 chris 2/26/2013
在不对结果执行任何操作的情况下存储结果似乎毫无用处。

答:

1赞 Joseph Mansfield 2/26/2013 #1

几乎可以肯定不会有区别。编译器可以对你的代码做任何它喜欢的事情,只要程序的行为就像你写的那样。因此,任何好的编译器都会摆脱毫无意义的初始化。

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

但是,如果按值返回,为什么情况并非如此呢?那么这将是复制省略的候选者,编译器可以摆脱该结构,无论它是否有副作用。operator*

3赞 Andy Prowl 2/26/2013 #2

在合理的假设下,对于类型的对象的选定重载返回的值是 类型,当使用大量优化选项时,一个体面的编译器会优化你的临时存储,所以就性能而言,这无关紧要operator ==Foobool

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

4赞 Andrew White 2/26/2013 #3

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

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

评论

2赞 Mooing Duck 2/26/2013
我发现当我将临时变量存储在变量中时,调试更容易,我只需在一行上中断并立即看到所有“临时”。否则,我必须先停下队伍,然后进出才能一次查看一个临时
0赞 Martin York 2/26/2013
我喜欢调试的温度。但对我来说是矫枉过正。这完全取决于上下文以及需要付出多少努力。result = a == b;