假设您的函数中的代码采用以下形式:
std::string data = ...;
//do some processing.
return data;
然后需要调用这个std::string
如果省略不可用,则移动构造函数。所以最坏的情况是,你得从你的内部弦上移开。
如果您无法承担移动操作的成本,那么您必须将其作为参考。
话虽如此......您是否担心编译器无法内联短函数?您是否担心小型包装器是否无法得到适当的优化?是否有编译器没有优化的可能性for
循环之类的东西让你烦恼吗?你有没有想过是否if(x < y)
比if(x - y < 0)
?
如果不是......那么你为什么关心复制/移动省略(“返回值优化”的技术术语,因为它用在比这更多的地方)?如果您使用的编译器不支持复制省略,那么您使用的编译器很糟糕,可能无法支持大量其他优化。出于性能考虑,您最好花时间升级编译器,而不是将返回值转换为引用。
防止实际发生的不可能的副本情况不值得......麻烦?可读性较差的代码?到底是什么?简单回报的额外因素是什么?
“额外的事情”是这样的:
std::string aString = to_string(a);
比这个更具可读性:
std::string aString;
to_string(a, aString);
在第一种情况下,它是立即地显然to_string
正在初始化一个字符串。在第二个例子中,事实并非如此;你必须抬头看to_string
的签名以查看它正在采取non-const
参考。
第一种情况甚至不是“惯用的”;一般人都会这样写。你永远不会看到to_int(a, someInt)
要求整数;这是荒谬的。为什么整数创建和对象创建如此不同?你不应该必须关心作为程序员,是否为返回值或其他原因发生了太多副本。你只需以简单、明显且易于理解的方式做事即可。