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

Deq*_*ing 3 c++ stl move-semantics c++11

通常我用它来避免复制成本:

void bar(const string& s);
void foo(const vector<int>& v);
Run Code Online (Sandbox Code Playgroud)

C++ 11中的STL容器是否都支持移动语义?

如果是这样,以下代码是否具有相同的性能const &

void bar(string s);
void foo(vector<int> v);
Run Code Online (Sandbox Code Playgroud)

Cub*_*bic 6

移动语义不只是神奇地使你的代码更快.

使用它们,调用类似函数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);
   }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下askOnce,参数可以复制到函数中或移动.当它调用prompt时,可以移动参数.

askManyTimes但是,你需要不断的争论周围,所以你不能动,所以你实际上最终不得不创建你的问题的10份没有很好的理由.

通常,如果您不需要修改字符串或将其复制到其他地方,您仍应使用const std::string&; 如果您以后需要进行复制,可以将参考文件保留为关闭状态.


eml*_*lai 5

C++ 11中的STL容器是否都支持移动语义?

是.

如果是这样,以下代码是否具有相同的性能const &

不,如果参数是左值.如果参数是右值,则性能至少同样好.

  • 在一个的情况下左值,参数具有被复制.没有办法解决这个问题.函数签名指定它不修改其参数,但移动操作可能会修改正在移动的对象.

  • rvalue的情况下,如果支持,则可以移动参数.

因此,如果参数将被复制到函数内部,最好通过值传递它,以便可以移动rvalues,同时仍然可以复制lvalues.