在C++函数中使用多个返回语句 我想知道如果函数中只有一个返回语句,对于C++编译器是否可能有点优势。我的一位前任老板曾经这样告诉过我,但我不明白声明一个返回变量与简单地使用多个返回语句(例如在一个switch case语句中)之间是否有任何区别
所以我的问题是:在质量、性能或堆栈内存节省方面有什么不同吗?不要编写适合您的编译器的代码。这会随着每个编译器和编译器版本的变化而变化。今天是正确的,明天可能是错误的。编写代码,使其可读并显示您的意图在C++函数中使用多个返回语句 我想知道如果函数中只有一个返回语句,对于C++编译器是否可能有点优势。我的一位前任老板曾经这样告诉过我,但我不明白声明一个返回变量与简单地使用多个返回语句(例如在一个switch case语句中)之间是否有任何区别,c++,return,statements,C++,Return,Statements,所以我的问题是:在质量、性能或堆栈内存节省方面有什么不同吗?不要编写适合您的编译器的代码。这会随着每个编译器和编译器版本的变化而变化。今天是正确的,明天可能是错误的。编写代码,使其可读并显示您的意图 至于多重回报,我高度怀疑这有什么区别。至于尝试、编译和分析,请注意,优化对上下文的影响很大。在您的测试用例中,多个返回的速度可能是原来的两倍,但在下一个函数中,如果它显示出差异的话,则速度可能是原来的一半。为了得到一个可靠的比较,你必须测试许多不同的功能和使用它们的地方。但是,如果您编译了这两个程序
至于多重回报,我高度怀疑这有什么区别。至于尝试、编译和分析,请注意,优化对上下文的影响很大。在您的测试用例中,多个返回的速度可能是原来的两倍,但在下一个函数中,如果它显示出差异的话,则速度可能是原来的一半。为了得到一个可靠的比较,你必须测试许多不同的功能和使用它们的地方。但是,如果您编译了这两个程序,并得到了相同或几乎相同的汇编程序,这就很好地表明编译器确实不在乎。不要编写适合您的编译器的代码。这会随着每个编译器和编译器版本的变化而变化。今天是正确的,明天可能是错误的。编写代码,使其可读并显示您的意图 至于多重回报,我高度怀疑这有什么区别。至于尝试、编译和分析,请注意,优化对上下文的影响很大。在您的测试用例中,多个返回的速度可能是原来的两倍,但在下一个函数中,如果它显示出差异的话,则速度可能是原来的一半。为了得到一个可靠的比较,你必须测试许多不同的功能和使用它们的地方。但是如果你编译了这两个程序,得到了相同或几乎相同的汇编程序,这就很好地表明编译器真的不在乎。不,不在乎 我确实喜欢有很多返回值。这大大简化了代码,我没有发现任何问题。我使用的IDE Visual Studio可以毫无问题地处理它。不,不太可能
我确实喜欢有很多返回值。这大大简化了代码,我没有发现任何问题。我使用的IDE Visual Studio可以毫无问题地处理它。理想情况下,您总是需要一条return语句,因为这可以确保您的代码始终返回一个值,并且您可以在返回该值之前设置该值,例如:
int getNumber(int x){
int toReturn = 0;
if (x == 0){
toReturn = 5;
} else {
toReturn = 10;
}
return toReturn;
}
如果要在If语句中返回,那么还必须在else语句中返回,如果要添加更多的case,就必须添加更多的return语句——如果有大量case,这可能会非常混乱,如果不小心,最终可能会影响编译时间
然而,有时您肯定需要不止一条返回语句。当您希望停止某些进一步的操作时,就会发生这种情况,例如在递归中,或者在评分算法中,一个或多个参数具有某种阈值,从而取消被评分对象的资格
例如,如果要根据距离为某个对象打分,但如果距离小于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.
}
理想情况下,您总是需要一个return语句,因为这样可以确保您的代码始终返回一个值,并且在返回该值之前设置该值,例如:
int getNumber(int x){
int toReturn = 0;
if (x == 0){
toReturn = 5;
} else {
toReturn = 10;
}
return toReturn;
}
如果要在If语句中返回,那么还必须在else语句中返回,如果要添加更多的case,就必须添加更多的return语句——如果有大量case,这可能会非常混乱,如果不小心,最终可能会影响编译时间
然而,有时您肯定需要不止一条返回语句。当您希望停止某些进一步的操作时,就会发生这种情况,例如在递归中,或者在评分算法中,一个或多个参数具有某种阈值,从而取消被评分对象的资格
例如,如果要根据距离为某个对象打分,但如果距离小于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.
}
请参阅小节Multiple return statements请参阅小节Multiple return statements此问题可能与以下问题有关-编译器不会将返回变量创建为局部变量,并在函数命中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;
}
}
但是,在这段代码中,编译器不能说应该在分配了新值的变量的位置生成哪个变量。在功能评估期间,两者可以同时存在,并在最后进行更新和决定应返回哪一个
string make_name(int num){
string result1 = "Simon Hrabec";
string result2 = "Simon John";
if (num & 1){
return result1;
} else {
return result2;
}
}
但是,我并不暗示要使用这种编程风格。这个问题可能与-编译器不会将返回变量创建为局部变量,并在函数命中返回语句时进行赋值/复制构造有关,相反,它将在变量的内存地址中构建变量,并将值分配给该变量 您可以有多个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;
}
}
但是,在这段代码中,编译器不能说应该在分配了新值的变量的位置生成哪个变量。在功能评估期间,两者可以同时存在,并在最后进行更新和决定应返回哪一个
string make_name(int num){
string result1 = "Simon Hrabec";
string result2 = "Simon John";
if (num & 1){
return result1;
} else {
return result2;
}
}
不过,我并不暗示要使用这种编程风格。请参见->我的->不要两者都尝试,使用优化编译,然后检查程序集?@NathanOliver,因为直到现在我才习惯于汇编代码,不知道如何甚至-我如何检查它?这是一个非常好的工具:那一个非常棒,非常感谢@NathanOliverSee->My not Twill,使用优化编译并检查程序集?@Nathanolivere,因为直到现在我还不习惯汇编代码,甚至不知道如何检查它。这里有一个非常好的工具:这个工具非常棒,非常感谢@Nathanolivery,虽然这在理论上可以回答问题,但在此处包含答案的基本部分,并提供链接供参考。虽然这在理论上可以回答问题,但在此处包含答案的基本部分,并提供链接以供参考。如果要通过引用返回值,是否仍有方法执行此操作?如果您通过引用返回不同的值,我看不到绕过多个return语句的方法,因为您不能在不初始化引用变量的情况下声明引用变量。如果您希望通过引用返回值,是否还有一种方法可以做到这一点?如果您通过引用返回不同的值,我看不到绕过多个return语句的方法,因为您不能在不初始化引用变量的情况下声明引用变量。