【发布时间】:2013-08-29 03:14:52
【问题描述】:
在过去,如果我想要一个对象A 的字符串表示,我会写一些带有签名void to_string(const A& a, string& out) 的东西以避免额外的副本。这仍然是 C++11 中的最佳实践,包括移动语义和所有内容吗?
我在其他上下文中阅读了一些建议依赖 RVO 而不是写 string to_string(const A& a) 的 cmets。但 RVO 不保证会发生!那么,作为 to_string 的程序员,我如何保证字符串不会被不必要地复制(独立于编译器)?
【问题讨论】:
-
这在很长一段时间内都不是最佳做法(甚至在移动之前)。
-
如果不能使用 RVO,那么编译器将首先尝试在默认情况下返回复制之前移动。别担心,顺其自然地写东西。
-
如果你必须保证它,那么你必须使用参考。但是,我知道没有不实现 RVO 的编译器。如果这样的野兽确实存在,那么它生成的代码的性能就不太重要了。无论哪种方式,只需使用 RVO。
-
完整的答案将分布在多个答案和 cmets 中,因此我创建了一个包含自包含答案的社区 wiki 帖子
标签: c++11 copy move-semantics return-by-reference return-by-value