在编写函数时,似乎总是有两个阵营。
- 那些希望返回 1 的函数可以在函数中找到(通常在最后)
- 那些喜欢线性数据流的人(通常有多个返回)
通常这更多的是个人风格,但我想谈谈性能。在我问这个问题之前,让我先提出一个假设场景:
假设要求状态:
Function should first try to calc ReturnVal based off of A. (Typical Case)
If A is unable to be determined then try to find based off of B.
If B is unable to be determined then try to find based off of C.
If all else fails then return C since that is always known.
Function should return enum which states which way the value was found.
因此,可以说我们有以下内容:
enum HowFound
{
eWithA,
eWithB,
eWithC
};
HowFound CalcReturn(int& nValue) const;
我的问题 就速度(jmp 的数量等)而言,您认为编译器在大多数情况下可以更好地优化哪种风格?
样式 1
HowFound CalcReturn(int& nValue) const
{
HowFound howFound = eWithA;
const int valWithB = CalcWithB();
const int valWithC = CalcWithC();
nValue = CalcWithA( valWithB, valWithC );
if (nValue == -1)
{
nValue = valWithB;
howFound = eWithB;
if (nValue == -1)
{
nValue = valWithC;
howFound = eWithC;
}
}
return howFound;
}
使用样式 1,您存储返回值并且永远不会提前终止函数。你有一个回报,它位于最后。
风格 2
HowFound CalcReturn(int& nValue) const
{
const int valWithB = CalcWithB();
const int valWithC = CalcWithC();
nValue = CalcWithA( valWithB, valWithC );
if (nValue != -1)
{
return eWithA;
}
if (valWithB != -1)
{
nValue = valWithB;
return eWithB;
}
nValue = valWithC;
return eWithC;
}
使用样式 2,数据流更加“线性”。一旦找到该值,您就退出该函数。这意味着函数中有更多的终止点。
免责声明:显然每种样式都可以进行一些调整,但我的问题仍然保持不变。另外,是的,我可以编写这两个函数并检查反汇编(我有),但是随着更多“细节”的添加,结果会发生变化。我的问题是关于哪种风格表现更好的可能性更高(如果有的话)。
谢谢!