簡體   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