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