【发布时间】:2016-02-02 12:48:12
【问题描述】:
以下函数接受一个字符串作为参数,并在经过一些处理后返回另一个。
假设编译器将执行移动优化是否足够公平,并且我不会在每次调用后复制字符串的内容?这个函数是否应该遵循copy elision [(N)RVO]?
作为一种做法,这样做是否可取?
std::string foo(std::string const& s)
{ // Perform sanity check on s
// ...
std::stringstream ss;
// do something and store in ss
// ...
return ss.str();
}
因为,否则,我一般遵循通过引用返回字符串的做法。所以,可以说,我的函数签名是:
void foo (std::string const& inValue, std::string& outValue);
【问题讨论】:
-
你不用担心,编译器会通过移动或删除来优化复制。
-
如果你把
s放在stringstream中,那么我很确定它会在输入时被复制,在输出时被复制。 -
你可以写
return std::move(ss).str(),以防你的实现优化了这种情况(不确定是否有)。 -
可以理解return move();部分!但我无法理解您评论的后半部分“不确定是否有”