我听过Herb Sutter最近的一次演讲,他建议用const &取代std::vector和std::string的理由已经基本消失了。他建议现在更可取的做法是编写如下函数:
std::string do_something ( std::string inval )
{
std::string return_val;
// ... do stuff ...
return return_val;
}据我所知,在函数返回时,return_val将是一个右值,因此可以使用移动语义返回,这非常便宜。但是,inval仍然比引用的大小大得多(通常以指针的形式实现)。这是因为std::string有各种组件,包括指向堆的指针和用于短字符串优化的成员char[]。所以在我看来,通过引用传递仍然是一个好主意。
有人能解释一下赫伯为什么会这么说吗?
发布于 2013-08-24 00:33:00
简短答案:NO! Long答案:
如果您不修改字符串(将其视为只读),请将其作为 const ref&**.**传递
(当使用它的函数计划修改它,或者您知道它将超出作用域时,(threads),const ref&显然需要保持在作用域内。不要在你的function executes)
const ref&
在cpp-next.com上有一个叫做的帖子。TL;DR:
指南:不要复制你的函数参数。取而代之的是,通过值传递它们,并让编译器进行复制。
^的翻译
不要复制您的函数参数值-意思是:如果您计划通过将参数值复制到内部变量来修改参数值,则只需使用参数即可。
所以,,不会这么做
std::string function(const std::string& aString){
auto vString(aString);
vString.clear();
return vString;
}执行此操作
std::string function(std::string aString){
aString.clear();
return aString;
}当您需要修改函数体中的参数值时。
你只需要知道你打算如何在函数体中使用参数。是否为只读...如果它停留在范围之内。
https://stackoverflow.com/questions/10231349
复制相似问题