[英]Why can we not use move semantics only apply for pass-by-value and not const lvalue reference?
[英]No need to use const & for STL container parameters as we have move semantics?
通常我用它来避免复制成本:
void bar(const string& s);
void foo(const vector<int>& v);
C ++ 11中的STL容器是否都支持移动语义?
如果是这样,以下代码是否具有与const &
相同的性能?
void bar(string s);
void foo(vector<int> v);
移动语义不只是神奇地使你的代码更快。
使用它们,调用像void bar(string s)
这样的函数比你必须复制参数时更快,但仅限于可以移动参数的情况。 考虑这种情况:
std::string prompt(std::string prompt_text);
void askOnce(std::string question) { prompt(question); }
void askManyTimes(std::string question) {
for(int i=0; i<10; ++i) {
askOnce(question);
}
}
在askOnce
的情况下,可以将参数复制到函数中或移动。 当它调用prompt时,可以移动参数。
然而,在askManyTimes
中,你需要保持参数,以便你不能移动,所以你实际上最终必须创建10个问题的副本,没有充分的理由。
通常,如果您不需要修改字符串或将其复制到其他地方,您仍应使用const std::string&
; 如果您以后需要进行复制,可以将参考文件保留为关闭状态。
C ++ 11中的STL容器是否都支持移动语义?
是。
如果是这样,以下代码是否具有与
const &
相同的性能?
不,如果参数是左值 。 如果参数是右值 ,则性能至少同样好。
在左值的情况下,参数必须被复制。 没有办法解决这个问题。 函数签名指定它不修改其参数,但移动操作可能会修改正在移动的对象。
在rvalue的情况下,如果支持,则可以移动参数。
因此,如果参数将被复制到函数内部,最好通过值传递,以便可以移动rvalues,同时仍然可以复制lvalues。
这取决于你传入的内容。如果你传递一个临时对象,它将被移入 ,但如果你传递一个命名变量,它将被复制 。
bar(func_returns_string()); // move
std::string s;
bar(s); // copy
您可以使用std::move
强制它移动命名变量:
bar(std::move(s)); // move (now s is empty)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.