【发布时间】:2021-12-27 12:02:07
【问题描述】:
假设我有这个代码:
void MyFunc(const std::string& param) {
std::string maybe_altered_param;
if (ConditionIsMet()) {
maybe_altered_param = AlterParam(param);
} else {
maybe_altered_param = param; // <-- unnecessary copy
}
// do stuff with maybe_altered_param
// maybe_altered_param does not need to be modified further.
}
AlterParam 函数返回字符串的副本,因此当ConditionIsMet 返回 true 时,会创建一个副本以填充 may_altered_param。
但是,当ConditionIsMet() 返回 false 时也会进行复制,这是次优的。在第二种情况下,我只想为同一个对象使用另一个名称,而不需要副本或任何类似的东西。
在这种情况下删除不必要的副本的最简单方法是什么?
【问题讨论】:
-
std::string &&maybe_altered_param = ConditionIsMet() ? AlterParam(param) : param;或(在你的情况下更好?)std::string const &maybe_altered_param = ConditionIsMet() ? AlterParam(param) : param; -
这两种情况下,设置后就再也没有修改过吗?
-
这个额外的副本在配备多赫兹、多核 CPU 的现代 PC 上会减慢多少速度?这个副本会产生什么问题?
-
@EOF 在没有额外副本的情况下可以使用吗?阅读这个问题 (stackoverflow.com/questions/54601265/…) 似乎无论如何都会制作一个额外的副本
-
@EOF:三元运算符会进行复制,因为
std::common_type<const std::string&, std::string>是std::string。
标签: c++ move copy-constructor