मान लेते हैं कि मैं इस कदम constructor
और operator=(Foo&&)
साथ struct Foo
करते हैं, और मैं डेटा सदस्य के रूप में यह प्रयोग किया है:सी ++ std :: चाल यहाँ खराब है?
Foo f()
{
Foo foo;
//code
return foo;
}
struct Boo {
Foo foo;
Boo() {
foo = f();//1
foo = std::move(f());//2
}
};
मामले (2) मैं वास्तव में std::move
, लेकिन क्या अगर मैं इसे यहां इस्तेमाल की जरूरत नहीं , क्या यह कुछ खराब बनाता है, अनुकूलन को रोकने की तरह?
मैं इस पढ़ें: Why does std::move prevent RVO?
और RVO
की return foo;
return std::move(foo);
के कारण अक्षम करने से बदल रहा है कि यह पता लगाना है, लेकिन क्या बारे में (2) यह इसी तरह की स्थिति पैदा कर रहा है? और यदि हां, तो क्यों?
कॉपी इस मामले में लागू नहीं होगा क्योंकि आप 'foo.operator =' को कॉल कर रहे हैं। यदि आपके पास 'Foo foo = std :: move (f()) था, तो यह प्रासंगिक होगा;' प्रारंभिकरण है। –
@ एमएम लेकिन 'क्लैंग 3.7' इस बारे में चेतावनी देते हैं, इसलिए मुझे आश्चर्य है, क्या यह चेतावनी पीढ़ी में बग है, या मुझे – user1244932
कुछ याद आया यह कारणों से भी खराब हो सकता है जो प्रदर्शन कारण भी नहीं हैं। # 2 के लिए आपके मामले में, आप पहले से ही एक rhr पर std :: move (f()) को कॉल करने की परवाह करते हैं, इसलिए चाल बर्बाद हो जाती है। अंगूठे का मेरा नियम यह है कि आपको std :: move से बचना चाहिए जब तक कि आपको नहीं करना चाहिए, और आपको केवल तब ही करना होगा जब आप एक गैर-तुच्छ तरीके से स्वामित्व स्थानांतरित कर रहे हों। – IdeaHat