在 C++ 函数中使用多个 return 语句
using multiple return statements in a c++ function
我想知道如果一个函数中只有一个 return 语句,这对 c++ 编译器是否有好处。我的一位前任老板曾经这样告诉我,但我不明白声明 return 变量或简单地具有多个 return 语句之间是否有任何区别,例如在 switch-case 语句中。
所以我的问题是:在质量、性能或堆栈内存节省方面是否存在任何差异?
不要编写适合您的编译器的代码。这随着每个编译器和编译器版本而改变。今天是真的,明天可能是错的。编写代码,使其可读并显示您的意图。
至于多个 returns 我非常怀疑这有什么区别。至于尝试、编译和分析,请注意优化对上下文的高度怀疑。多个 returns 在您的测试用例中可能快两倍,但在下一个函数中可能快一半,如果它显示出完全不同的话。为了获得可靠的比较,您必须测试许多不同的功能和使用它们的地方。但是,如果您编译两者并获得相同或几乎相同的汇编器,这很好地表明编译器真的不关心。
不,不是真的。
我确实喜欢拥有许多 return 价值观。它大大简化了代码,我发现它没有问题。 Visual Studio,我用的IDE,处理起来没问题。
理想情况下,您总是需要一个 return 语句,因为这确保您的代码始终 return 一个值,并且您在 return 之前设置该值,例如:
int getNumber(int x){
int toReturn = 0;
if (x == 0){
toReturn = 5;
} else {
toReturn = 10;
}
return toReturn;
}
如果您要在 "if" 语句中 return,那么您还必须在 "else" 语句中 return,并且如果您想添加更多情况下,您必须添加更多 "return" 语句 - 如果您有大量情况,这可能会非常混乱,如果您不小心,最终可能会影响您的编译时间。
但是,有时您确实需要多个 return 语句。当有一些您想要停止的进一步操作时会发生这种情况 - 例如在递归中,或者在对一个或多个参数具有某种阈值的评分算法中,这些参数会使被评分的对象不合格。
例如,如果您想根据某物的距离对其进行评分,但如果距离小于 10,则始终希望分数为零,则:
float scoreObject(float distance){
if(distance < 10){
return 0;
}
float score;
//Scoring function continues here, presumably with some time-intensive
//calculations that the above return statement avoids doing.
return score;
//Please note that this would result in a crash as score is not initialized.
}
参考 https://en.wikipedia.org/wiki/Return_statement 小节 多个 return 语句
此问题可能与 return value optimisation 有关 - 编译器不会将 returned 变量创建为局部变量并在函数命中 [=27= 时执行 assignmen/copy 构造] 语句,而是它将在要分配值的变量的内存地址中构建变量。
您可以有多个 return 语句,如果您 return 使用同一个变量,这应该无关紧要。但是,如果您的函数中有多个变量并且您 return 那么根据代码流的不同,编译器无法执行此类优化。
让我们进行以下作业
string str;
str = make_name(2);
编译器可能会在以下代码中执行 RVO
string make_name(int num){
string result = "Simon";
if (num & 1){
result.append(" Hrabec");
return result;
} else {
result.append(" John");
return result;
}
}
然而,在这段代码中,编译器无法确定哪个变量应该构建在分配了新值的变量的位置。在函数评估期间,两者可以同时存在,进行更新并在最后决定应该 returned。
string make_name(int num){
string result1 = "Simon Hrabec";
string result2 = "Simon John";
if (num & 1){
return result1;
} else {
return result2;
}
}
但是我并不暗示要使用这样的编程风格。
我想知道如果一个函数中只有一个 return 语句,这对 c++ 编译器是否有好处。我的一位前任老板曾经这样告诉我,但我不明白声明 return 变量或简单地具有多个 return 语句之间是否有任何区别,例如在 switch-case 语句中。
所以我的问题是:在质量、性能或堆栈内存节省方面是否存在任何差异?
不要编写适合您的编译器的代码。这随着每个编译器和编译器版本而改变。今天是真的,明天可能是错的。编写代码,使其可读并显示您的意图。
至于多个 returns 我非常怀疑这有什么区别。至于尝试、编译和分析,请注意优化对上下文的高度怀疑。多个 returns 在您的测试用例中可能快两倍,但在下一个函数中可能快一半,如果它显示出完全不同的话。为了获得可靠的比较,您必须测试许多不同的功能和使用它们的地方。但是,如果您编译两者并获得相同或几乎相同的汇编器,这很好地表明编译器真的不关心。
不,不是真的。
我确实喜欢拥有许多 return 价值观。它大大简化了代码,我发现它没有问题。 Visual Studio,我用的IDE,处理起来没问题。
理想情况下,您总是需要一个 return 语句,因为这确保您的代码始终 return 一个值,并且您在 return 之前设置该值,例如:
int getNumber(int x){
int toReturn = 0;
if (x == 0){
toReturn = 5;
} else {
toReturn = 10;
}
return toReturn;
}
如果您要在 "if" 语句中 return,那么您还必须在 "else" 语句中 return,并且如果您想添加更多情况下,您必须添加更多 "return" 语句 - 如果您有大量情况,这可能会非常混乱,如果您不小心,最终可能会影响您的编译时间。
但是,有时您确实需要多个 return 语句。当有一些您想要停止的进一步操作时会发生这种情况 - 例如在递归中,或者在对一个或多个参数具有某种阈值的评分算法中,这些参数会使被评分的对象不合格。
例如,如果您想根据某物的距离对其进行评分,但如果距离小于 10,则始终希望分数为零,则:
float scoreObject(float distance){
if(distance < 10){
return 0;
}
float score;
//Scoring function continues here, presumably with some time-intensive
//calculations that the above return statement avoids doing.
return score;
//Please note that this would result in a crash as score is not initialized.
}
参考 https://en.wikipedia.org/wiki/Return_statement 小节 多个 return 语句
此问题可能与 return value optimisation 有关 - 编译器不会将 returned 变量创建为局部变量并在函数命中 [=27= 时执行 assignmen/copy 构造] 语句,而是它将在要分配值的变量的内存地址中构建变量。
您可以有多个 return 语句,如果您 return 使用同一个变量,这应该无关紧要。但是,如果您的函数中有多个变量并且您 return 那么根据代码流的不同,编译器无法执行此类优化。
让我们进行以下作业
string str;
str = make_name(2);
编译器可能会在以下代码中执行 RVO
string make_name(int num){
string result = "Simon";
if (num & 1){
result.append(" Hrabec");
return result;
} else {
result.append(" John");
return result;
}
}
然而,在这段代码中,编译器无法确定哪个变量应该构建在分配了新值的变量的位置。在函数评估期间,两者可以同时存在,进行更新并在最后决定应该 returned。
string make_name(int num){
string result1 = "Simon Hrabec";
string result2 = "Simon John";
if (num & 1){
return result1;
} else {
return result2;
}
}
但是我并不暗示要使用这样的编程风格。