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)
移动语义不只是神奇地使你的代码更快.
使用它们,调用类似函数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&; 如果您以后需要进行复制,可以将参考文件保留为关闭状态.
C++ 11中的STL容器是否都支持移动语义?
是.
如果是这样,以下代码是否具有相同的性能
const &?
不,如果参数是左值.如果参数是右值,则性能至少同样好.
在一个的情况下左值,参数具有被复制.没有办法解决这个问题.函数签名指定它不修改其参数,但移动操作可能会修改正在移动的对象.
在rvalue的情况下,如果支持,则可以移动参数.
因此,如果参数将被复制到函数内部,最好通过值传递它,以便可以移动rvalues,同时仍然可以复制lvalues.
| 归档时间: |
|
| 查看次数: |
160 次 |
| 最近记录: |