为什么不同作用域的不同变量具有相同的内存地址? [重复]

问题描述 投票:0回答:2
#include<string>
#include<iostream>

std::string add_strings(std::string str1, std::string str2){
    std::string result = str1 + str2;
    std::cout << "In : &result(std::string) :  " << &result << std::endl;
    return result;
}

int main(){
    std::string in_str1{"Hello"};
    std::string in_str2{" World!"};
    std::string result_str = add_strings(in_str1,in_str2);
    std::cout << "Out : &result_str(std::string) :  " << &result_str << std::endl;
    std::cout << "result_str : " << result_str << std::endl;
}

我发现一些解释说编译器将默认的按值返回转换为按引用返回,但我想知道这是否正确。

c++ compiler-construction gnu
2个回答
0
投票

这是因为命名返回值优化,NRVO。

result
中的
add_strings()
变量是直接在内存中
result_str
所在的位置创建的,因此在这种情况下,当您
return result;
时,不会进行复制或移动。

我找到了一些解释,告诉编译器将默认的按值返回转换为按引用返回

它是按值返回,但由于函数中的所有路径都通向

return result;
,因此实际的副本被省略。只产生了一根刺,而不是两根。


0
投票

这是因为命名返回值优化直接在对象被复制/移动到的存储中创建对象。

您可以使用标志-fno-elide-constructors

禁用此功能

演示

© www.soinside.com 2019 - 2024. All rights reserved.