提问人:Pavel Dubsky 提问时间:2/26/2013 最后编辑:Pavel Dubsky 更新时间:5/15/2014 访问量:508
在变量中存储返回前的值
Storing value before return in a variable
问:
下面是一段代码:
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;
}
我想知道以这两种不同的方式返回值(即时返回或将结果存储在变量中)是否有任何区别。我认为存储更适合调试,但是使用其中之一是否有任何性能损失(我认为没有)或任何其他利弊。
答:
1赞
Joseph Mansfield
2/26/2013
#1
几乎可以肯定不会有区别。编译器可以对你的代码做任何它喜欢的事情,只要程序的行为就像你写的那样。因此,任何好的编译器都会摆脱毫无意义的初始化。
但是,可能会出现无法使此初始化消失的情况。例如,如果用于的重载通过引用返回类类型结果,则该类类型的构造函数可能会产生一些副作用。如果是这样,编译器就无法摆脱初始化,因为它会改变程序的可观察行为。operator*
GetValue() * GetOtherValue()
const
但是,如果按值返回,为什么情况并非如此呢?那么这将是复制省略的候选者,编译器可以摆脱该结构,无论它是否有副作用。operator*
3赞
Andy Prowl
2/26/2013
#2
在合理的假设下,对于类型的对象的选定重载返回的值是 类型,当使用大量优化选项时,一个体面的编译器会优化你的临时存储,所以就性能而言,这无关紧要。operator ==
Foo
bool
我的建议是选择使您的代码更具可读性或更便于维护或调试的形式。
4赞
Andrew White
2/26/2013
#3
编译器可以自由地优化局部变量,因此性能将是相同的。
在许多代码分析工具中,这被标记为代码异味,我倾向于同意。调试器可以查看堆栈上的返回值,以便局部变量不会购买任何东西。
评论
2赞
Mooing Duck
2/26/2013
我发现当我将临时变量存储在变量中时,调试更容易,我只需在一行上中断并立即看到所有“临时”。否则,我必须先停下队伍,然后进出才能一次查看一个临时
0赞
Martin York
2/26/2013
我喜欢调试的温度。但对我来说是矫枉过正。这完全取决于上下文以及需要付出多少努力。result = a == b;
评论