【发布时间】:2010-01-08 06:29:58
【问题描述】:
从下面的代码中,如果发生了 RVO,我希望看到 2 个地址指向同一个位置,但事实并非如此(我的编译器是 MS VC9.0)
#include <iostream>
#include <string>
std::string foo(std::string& s)
{
std::cout << "address: " << (unsigned int)(&s) << std::endl;
return s;
}
int main()
{
std::string base = "abc";
const std::string& s = foo(base);
std::cout << "address: " << (unsigned int)(&s) << std::endl;
std::cout << s << std::endl;
return 0;
}
RVO 应该在什么条件下发生?
顺便说一句,我的问题基于以下讨论:http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/
【问题讨论】:
-
我是 OP 问题,他正在从函数返回的内容中获取参考。通常每个人都应该说“可怕,它要崩溃了!”但在这种情况下,他将其声明为 const 的事实将临时对象的寿命延长到范围的末尾,从而为他节省了预期的崩溃。但在任何情况下,由于那个引用,他无论如何都没有使用任何返回值。
标签: c++ return-value return-value-optimization