मुझे पता है कि यह आम तौर पर std::move
साथ वापस जाने के लिए एक अच्छा विचार नहीं है हूँ, अर्थातएकाधिक रिटर्न स्टेटमेंट के मामले में 'std :: move` समझदार के साथ वापस आ रहा है?
bigObject foo() { bigObject result; /*...*/ return std::move(result); }
बजाय बस
bigObject foo() { bigObject result; /*...*/ return result; }
क्योंकि यह वापसी मान अनुकूलन के रास्ते में हो जाता है। लेकिन
return std::move(result);
में कई अलग अलग रिटर्न के साथ एक समारोह, विशेष रूप से की तरह
class bar {
bigObject fixed_ret;
bool use_fixed_ret;
void prepare_object(bigObject&);
public:
bigObject foo() {
if(use_fixed_ret)
return fixed_ret;
else{
bigObject result;
prepare_object(result);
return result;
}
}
};
मुझे लगता है कि सामान्य वापसी मान अनुकूलन इस तरह के एक समारोह में असंभव है कुछ के मामले में क्या है, तो यह एक अच्छा विचार हो सकता है डाल करने के लिए
यहाँ, या मैं नहीं बल्कि करना चाहिए (IMO भद्दा है, लेकिन यह बहस का मुद्दा है)
bigObject foo() {
bigObject result;
if(use_fixed_ret)
result = fixed_ret;
else{
prepare_object(result);
}
return result;
}
मैं मानक का संदर्भ नहीं दे सकता, इसलिए मैं जवाब नहीं दूंगा, लेकिन मुझे यकीन है कि आपको std :: move की आवश्यकता नहीं है, मुझे लगता है कि आप आरवीओ को भ्रमित कर रहे हैं और प्रतिलिपि की प्रतिलिपि बना रहे हैं, प्रतिलिपि elision अनुकूलन है कि कुछ पर लाभ एक सिंगल रिटर्न पथ वाले कंपाइलर। बिगऑब्जेक्ट आर-वैल्यू का सम्मान बन जाएगा जहां यह लौटाया गया था। – 111111
हां, मुझे लगता है कि कॉपी एलिजन शुरुआत में मेरा मतलब है। – leftaroundabout
यदि आपको साफ कोड और कोड स्तर अनुकूलन पसंद हैं, तो आप ऐसा लगता है, :), आप अपने 'foo() 'फ़ंक्शन में' else {... 'शाखा से छुटकारा पा सकते हैं। जैसे कि पहला कथन सत्य है तो दूसरे का मूल्यांकन नहीं किया जाएगा। – 111111