Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.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++ (N)RVO的完整示例_C++_Move Semantics_Nrvo - Fatal编程技术网

C++ (N)RVO的完整示例

C++ (N)RVO的完整示例,c++,move-semantics,nrvo,C++,Move Semantics,Nrvo,我一直在阅读关于(N)RVO的文章,我想要一个完整的场景描述。我希望这个问题能为其他C++学习者澄清他们的想法。 假设这种情况: string get_string() { string x("racecar"); //work on x... return x; } string a( get_string() ); string b = get_string(); 请暂时忽略C++11移动语义 如果未执行(N)RVO,将有多少构造函数/赋值/析构函数 执行?(请

我一直在阅读关于(N)RVO的文章,我想要一个完整的场景描述。我希望这个问题能为其他C++学习者澄清他们的想法。 假设这种情况:

string get_string() {
    string x("racecar");
    //work on x...
    return x;
}

string a( get_string() );
string b = get_string();
请暂时忽略C++11移动语义

  • 如果未执行(N)RVO,将有多少构造函数/赋值/析构函数 执行?(请指出它们所指的对象)
  • 如果应用(N)RVO,会有什么变化?
  • 最后,假设
    std::string
    支持 移动语义
1)在
get_string
内部,将使用构造函数构造一个字符串对象(x),该构造函数采用
常量字符*

2) 当函数返回时,内部构造的字符串将被复制构造到调用方空间中的临时字符串对象

3) 临时文件将被复制到
a

4) 见1

5) 见2

6) 请参见3,但副本将转到
b

使用RVO,可以通过通过不可见的引用在函数内部构造临时变量来消除2和5。通过进一步的复制省略(非RVO),可以消除3和6。这就给我们留下了两个构造,都使用
constchar*
构造函数


使用C++11移动语义,如果编译器足够好,可以完成所有的复制省略,那么情况根本不会改变。如果未完成复制省略,则2、3、5和6仍然存在,但会变成移动而不是复制。但与复制省略不同,这些移动不是可选的优化。一致性编译器必须执行这些操作,前提是它尚未执行副本省略。

RVO只删除副本(2)和(5)。拷贝(3)和(6)可以通过正常省略临时变量来消除,而不受(n)RVO的影响。@CharlesBailey:你说得对。我倾向于将RVO合并为包含一般的复制省略,因为我同时了解了这两个方面。这正是我需要知道的,谢谢:)您是否有任何指向您(可能)在回答中没有提到的主题的链接?