可能是重复问题:
传递const std :: string&作为参数的时代已经过去了吗?
如果支持移动语义,我应该通过值还是引用(传递给未内联函数)传递std :: string
?对于使用小字符串优化(SSO)的实现呢?
可能是重复问题:
传递const std :: string&作为参数的时代已经过去了吗?
如果支持移动语义,我应该通过值还是引用(传递给未内联函数)传递std :: string
?对于使用小字符串优化(SSO)的实现呢?
根据字符串的使用方式,有多种可能的答案。
1) 如果将字符串用作 ID(不会被修改),最好通过常量引用传递:(std::string const&)
2) 修改字符串但不希望调用方看到这种变化。最好通过值传递:(std::string)
3) 修改字符串并希望调用方看到这种变化。最好通过引用传递:(std::string &)
4) 将字符串发送到函数中,函数的调用者将不再使用该字符串。可以考虑使用移动语义:(std::string &&)
std::string
实现不支持移动语义时才是必要的,对吗? - Nordlöwstd::string
中的 char *
移动到被调用函数中。如果您使用移动语义传递值,则该字符串将不再位于调用函数中,除非您将其传回。请参见上面讨论移动语义的链接。 - linuxuser27std::move
并调用按值传递版本来处理自己的参数时可以且应该处理的事情。 - Benjamin Lindleystd::string
并将其作为参数传递。然后,它会从该参数复制构造成员字符串。因此,每个参数需要两次分配和两次O(n)数组复制操作。你应该通过值来获取参数,并将它们std::move
到成员中。这样就只需要一次分配、一次O(n)数组复制和一次O(1)移动操作。 - emlai查看这个C++11的答案。基本上,如果你传递一个左值,则使用右值引用。
来自这篇文章:
void f1(String s) {
vector<String> v;
v.push_back(std::move(s));
}
void f2(const String &s) {
vector<String> v;
v.push_back(s);
}
"对于左值参数,‘f1’会有一份额外的拷贝传递参数,因为它是按值传递,而‘f2’则有一份额外的拷贝用于调用push_back。所以没有区别;对于右值参数,编译器必须创建一个临时对象'String(L“”)'并将其传递给‘f1’或‘f2’。因为当参数是一个临时对象(即右值)时,‘f2’可以利用移动构造函数,因此现在传递参数的成本对于‘f1’和‘f2’是相同的。”时,使用按值传递的方法可以获得更好的性能。"
我认为一般情况下,如果你需要在函数内部创建一个副本,那么应该通过值传递它。否则,通过const引用传递。
这里有一个很好的讨论:http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/