ama*_*jxq 9 c++ rvalue lvalue rvo c++11
我正在读想要速度?通过价值.Dave Abrahams关于复制省略和RVO.而且我想知道为什么我们需要复制省略?
我被告知太多次你应该通过const引用传递函数参数以避免复制(我读过的几乎所有的c ++书都告诉我这个).
假设我们有两个功能:
int f1(const string &s);
int f2(string s);
Run Code Online (Sandbox Code Playgroud)
如果实际参数是右值,则在两个函数中都将避免复制.但如果实际参数是左值,则只能在f1中避免复制,而不是在f2中.那么为什么我们需要这个功能呢?
Ben*_*ley 11
如果您还需要副本,请按值传递.是否选择f1的签名或f2的签名取决于函数的内容.例如,在这种情况下,您将使用const引用:
int f1(const string& s) {
return s.size();
}
Run Code Online (Sandbox Code Playgroud)
但在这种情况下你会通过值传递:
int f2(string s) {
sort(s.begin(), s.end());
s.erase(unique(s.begin(), s.end()), s.end());
return s.size();
}
Run Code Online (Sandbox Code Playgroud)
因为替代方案是这样的:
int f2(const string& s) {
string temp(s);
sort(temp.begin(), temp.end());
temp.erase(unique(temp.begin(), temp.end()), temp.end());
return temp.size();
}
Run Code Online (Sandbox Code Playgroud)