gpt4 book ai didi

c++ - 函数的调用者如何知道是否使用了返回值优化?

转载 作者:可可西里 更新时间:2023-11-01 15:57:14 24 4
gpt4 key购买 nike

我对返回值优化的理解是,编译器 secret 传递存储返回值的对象的地址,并对该对象而不是局部变量进行更改。

例如代码

std::string s = f();

std::string f()
{
std::string x = "hi";
return x;
}

变得类似于

std::string s;
f(s);

void f(std::string& x)
{
x = "hi";
}

当使用 RVO 时。这意味着函数的接口(interface)已经改变,因为有一个额外的隐藏参数。

现在考虑以下我从维基百科窃取的案例

std::string f(bool cond)
{
std::string first("first");
std::string second("second");
// the function may return one of two named objects
// depending on its argument. RVO might not be applied
return cond ? first : second;
}

让我们假设编译器会将 RVO 应用于第一种情况,但不会应用于第二种情况。但是函数的接口(interface)不会根据是否应用 RVO 而改变吗?如果函数体f对编译器不可见,编译器如何知道是否应用了RVO以及调用者是否需要传递隐藏地址参数?

最佳答案

界面没有变化。在所有情况下,结果函数的 of 必须出现在调用者的范围内;通常,编译器使用隐藏指针。唯一的不同之处在于,当使用 RVO 时,就像您的第一种情况一样,编译器将“合并”x 和这个返回值,构建x 在指针给定的地址;不使用时,编译器将生成对复制构造函数的调用return 语句,将任何内容复制到此返回值中。

我可能会补充说,您的第二个示例不是非常接近发生。在调用站点,您几乎总能得到一些东西喜欢:

<raw memory for string> s;
f( &s );

被调用的函数要么构造一个局部变量或者直接在它被传递的地址临时,或者复制在此地址构造一些其他值。所以在你最后例如,return 语句或多或少是相当于:

if ( cont ) {
std::string::string( s, first );
} else {
std::string::string( s, second );
}

(显示传递给拷贝的隐式 this 指针构造函数。)在第一种情况下,如果 RVO 适用,则特殊代码将在 x 的构造函数中:

std::string::string( s, "hi" );

然后在函数的其他地方用 *s 替换 x(返回时什么也不做)。

关于c++ - 函数的调用者如何知道是否使用了返回值优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18637804/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com