繁体   English   中英

我们有移动语义,不需要使用const&作为STL容器参数吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM