use*_*145 7 c++ rvo nrvo c++11
假设我们有这种情况
std::string v_1()
{
return "name";
}
std::string test = v_1();
Run Code Online (Sandbox Code Playgroud)
RVO是否适用于此?我认为答案是否定的,因为应用RVO的规则是:" 如果函数按值返回类类型,则return语句的表达式是具有自动存储持续时间的非易失性对象的名称,这不是'函数参数或catch子句参数,并且具有与函数的返回类型相同的类型(忽略顶级cv资格),然后省略复制/移动 "并且在这种情况下返回的对象不具有相同类型的函数的返回类型,但我不是100%在这里不应用RVO.
非常感谢你.
PS.在这个演讲中https://www.youtube.com/watch?v=AKtHxKJRwp4(40分钟,第18分钟)来自微软的Stephan谈到了无法应用RVO的情况,因为函数的返回类型不同于返回对象的类型(在他的示例中为元组与对).我认为同样的原则适用于此.
我想你混淆了NRVO
用RVO
.
NRVO
- 命名返回值优化RVO
- (未命名)返回值优化NRVO
涉及一个命名变量,而RVO
涉及在return
语句中构造的未命名的临时变量.
视频中的示例是NRVO
,当类型不同时,显然无法在调用者堆栈上构造命名对象,因为在函数的堆栈中必须存在一个类型的一个对象,而在调用者的堆栈中必须存在另一个类型的另一个对象.
您的示例是RVO
您没有使用预先构造的命名对象.在您的代码中,您正在构建一个临时对象作为返回值.因为它是暂时的,所引用的规则不适用.
根据C++11
标准,我认为没有理由RVO
不能发生:
12.8复制和移动类对象[ class.copy ] ... 31 ...
- 当一个未绑定到引用(12.2)的临时类对象被复制/移动到具有相同cv-nonqualified类型的类对象时,可以通过直接构造临时对象来省略复制/移动操作省略的复制/移动的目标
通过返回一个char array
临时std::string
构造,这是返回给调用者的东西.