对于输出参数,通常的cpp建议是:"避免用可修改的引用传递输出参数,而用值返回"。"避免用可修改的引用来传递输出参数, 用值来代替返回". 现在如果我们有一种情况,我们想修改一个对象本身,比如。
string s = "whatever";
//maybe in a loop
s = modify(s);
那么它看起来像一个函数 string modify (string)
总是被类似于 modifyInPlace(string &)
. 有没有什么办法解决这个问题?有没有什么根本性的原因导致这个问题永远无法解决?我认为按值取值,按值返回的语义更安全,更清晰。
有没有什么办法解决这个问题呢?
你必须做出一个选择。要么是
你需要考虑哪种方式对你的程序更重要。
也就是说,如果你通过移动来创建修改后的副本,那么修改后副本的开销通常不会很大。
s = modify(std::move(s));
这里是你的基准的修改版: http:/quick-bench.comX_ONMO_yiAqbkkcbvsiC_Xpk5Sw
当您创建的新值不是基于同一类型的现有值时,"无参考输出参数 "的经验法则很好用。在这种情况下,通常没有可用的就地替代方法。
通过引用修改几乎总是比通过值修改快,除非您的值非常小(例如一个 int
). 这是因为,当你通过值来修改时,你必须在内存中创建一个值的副本来传递给函数,而引用则不必这样做。