2013-02-11 59 views
4

有人可以確認出來的函數的字符串是否會被移入成員變量或不是?我可以在函數的結果上使用std :: move來構造一個新的對象嗎?

class Foo { 
private: 
    const std::string m_complex_str; 

    std::string create_complex_str() { 
    return std::string("some huge string"); 
    } 

public: 
    Foo() : m_complex_str(std::move(create_complex_str())) { } 
}; 

這是正確的做法嗎?

也許大多數編譯器會爲我做這個沒有移動功能?

+6

是的,它會自動移動,'移動'是不必要的。 – 2013-02-11 01:06:56

+0

@SethCarnegie即使「一些巨大的字符串」周圍沒有std :: string()? – user2015453 2013-02-11 01:08:21

+5

是的,因爲'create_complex_str'通過值返回,並且該值是一個xvalue,它在您構造'm_complex_str'的​​點上。另外,在那裏使用'move'可能會阻止一個名爲RVO的編譯器優化,所以'move'不僅是不必要的,而且是有害的。 – 2013-02-11 01:08:33

回答

5

是的,這將被正確地移動,作爲std::string構造支持std::move,的create_complex_str()返回值是一個純粹的右值,其可以安全地move「d。事實上,即使你自己沒有這樣做,也會自動調用std::move(打斷點並查看) - 除非進一步進行優化。但是,如果您自己致電std::move,則可能會停止編譯器通過複製elision/RVO等進一步優化。

The compiler will eliminate unnecessary copies適用於您。只需編寫代碼(不要成爲早期優化的犧牲品!),以便讓編譯器清楚您的代碼應該具有的邏輯結果,並讓它擔心優化。像這樣的情況已經被所有編譯器深入研究,記錄和優化。

如果當將來你需要更高性能的代碼,你應該第一個配置文件,準確地尋找到瓶頸(它通常是,你認爲這可能是),然後才把着手使用hackery讓它更快更好地工作。

+2

好吧,在提供有用信息的同時,它完全忽略了問題的關鍵。 – 2013-02-11 08:22:43

+0

@Christian更新。 – 2013-02-11 18:32:17

相關問題