有没有一种有效的方法可以通过值来返回自赋值?

问题描述 投票:0回答:1

对于输出参数,通常的cpp建议是:"避免用可修改的引用传递输出参数,而用值返回"。"避免用可修改的引用来传递输出参数, 用值来代替返回". 现在如果我们有一种情况,我们想修改一个对象本身,比如。

string s = "whatever";
//maybe in a loop
s = modify(s);

那么它看起来像一个函数 string modify (string) 总是被类似于 modifyInPlace(string &). 有没有什么办法解决这个问题?有没有什么根本性的原因导致这个问题永远无法解决?我认为按值取值,按值返回的语义更安全,更清晰。

例如比较测量。http:/quick-bench.com-XZqOZw-X739tlcOI8vau8DU24w。

c++ parameter-passing return-value
1个回答
2
投票

有没有什么办法解决这个问题呢?

你必须做出一个选择。要么是

  • 创建一个修改后的副本,这对某些类型来说可能会很昂贵,或
  • 就地修改,这不符合你所描述的偏好,但对某些类型来说可能更快。

你需要考虑哪种方式对你的程序更重要。

也就是说,如果你通过移动来创建修改后的副本,那么修改后副本的开销通常不会很大。

s = modify(std::move(s));

这里是你的基准的修改版: http:/quick-bench.comX_ONMO_yiAqbkkcbvsiC_Xpk5Sw


当您创建的新值不是基于同一类型的现有值时,"无参考输出参数 "的经验法则很好用。在这种情况下,通常没有可用的就地替代方法。


0
投票

通过引用修改几乎总是比通过值修改快,除非您的值非常小(例如一个 int). 这是因为,当你通过值来修改时,你必须在内存中创建一个值的副本来传递给函数,而引用则不必这样做。

© www.soinside.com 2019 - 2024. All rights reserved.