Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C++函数中使用多个返回语句 我想知道如果函数中只有一个返回语句,对于C++编译器是否可能有点优势。我的一位前任老板曾经这样告诉过我,但我不明白声明一个返回变量与简单地使用多个返回语句(例如在一个switch case语句中)之间是否有任何区别_C++_Return_Statements - Fatal编程技术网

在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语句的方法,因为您不能在不初始化引用变量的情况下声明引用变量。