知识卡片
返回值优化省掉构造
内容
返回值优化让函数直接在返回目标存储中构造对象,省去中间复制或移动。命名局部对象对应 NRVO;对可消除的局部对象写 return move(x) 可能破坏优化条件。少写一次显式移动,反而可能少一次真正的移动。
参考来源
- 位置:《Effective Modern C++》第5章《右值引用,移动语义,完美转发》,条款二十五:对右值引用使用 std::move ,对通用引用使用 std::forward(源文件:_epub-src/EPUB/text/ch006.xhtml)
- 结论依据:原文给出拷贝消除条件,并区分命名与未命名返回对象,解释显式move破坏优化的原因。
- 原始内容:对这种好事遣词表达是个讲究活,因为你想只在那些不影响软件外在行为的地方允许这样的 拷贝消除 (copy elision)。对标准中教条的(也可以说是有毒的)絮叨做些解释,这个特定的好事就是说,编译器可能会在按值返回的函数中消除对局部对象的拷贝(或者移动),如果满足(1)局部对象与函数返回值的类型相同;(2)局部对象就是要返回的东西。(适合的局部对象包括大多数局部变量(比如 makeWidget 里的 w ),还有作为 return 语句…