我一直在阅读关于(N)RVO的文章,我想要一个完整的场景描述。我希望这个问题能帮助其他C++ -learners澄清他们的观点。
假设这个场景:
string get_string() {
string x("racecar");
//work on x...
return x;
}
string a( get_string() );
string b = get_string();请暂时忽略C++11移动语义。
发布于 2012-10-20 10:14:10
1)在get_string内部,将使用接受const char*的构造函数构造一个字符串对象(x)。
2)当函数返回时,内部构造的字符串将被复制到调用方空间中的临时字符串对象中。
( 3)临时复制到a。
4)见1
5)见2
6)见3,但副本将转到b
使用RVO,通过不可见的引用构造函数内部的临时结构可以消除2和5。与进一步的复制省略(而不是RVO),3和6可以消除。这就给我们留下了两个构造,都使用了const char*构造函数。
使用C++11移动语义,如果编译器足够好完成所有的复制省略,则情况根本不会改变。如果复制省略没有完成,那么2、3、5和6仍然存在,而是成为移动而不是副本。但是,与复制省略不同的是,这些操作不是可选的优化。一个符合标准的编译器必须执行它们,假设它还没有执行复制省略。
https://stackoverflow.com/questions/12987245
复制相似问题