कोड के निम्नलिखित दो टुकड़ों की तुलना करें, पहले एक बड़ी वस्तु के संदर्भ का उपयोग करते हुए, और दूसरे में बड़ी वस्तु वापसी मूल्य के रूप में होती है। "बड़ी वस्तु" पर जोर इस तथ्य को संदर्भित करता है कि वस्तु की दोहराई गई प्रतियां, अनावश्यक रूप से बर्बाद चक्र हैं।कार्यों में बड़े ऑब्जेक्ट्स लौटने
एक बड़ी वस्तु के लिए एक संदर्भ का उपयोग करना:
void getObjData(LargeObj& a)
{
a.reset() ;
a.fillWithData() ;
}
int main()
{
LargeObj a ;
getObjData(a) ;
}
एक वापसी मान के रूप में बड़ी वस्तु का उपयोग करना:
LargeObj getObjData()
{
LargeObj a ;
a.fillWithData() ;
return a ;
}
int main()
{
LargeObj a = getObjData() ;
}
कोड के पहले टुकड़ा बड़ी वस्तु को कॉपी आवश्यकता नहीं है।
दूसरे स्निपेट में, ऑब्जेक्ट फ़ंक्शन के अंदर बनाया गया है, और इसलिए सामान्य रूप से, ऑब्जेक्ट लौटने पर प्रतिलिपि की आवश्यकता होती है। इस मामले में, हालांकि, main()
में ऑब्जेक्ट घोषित किया जा रहा है। क्या संकलक पहले डिफॉल्ट-निर्मित ऑब्जेक्ट बनाते हैं, फिर getObjData()
द्वारा ऑब्जेक्ट की प्रतिलिपि बनाएँ, या यह पहले स्निपेट के रूप में उतना ही कुशल होगा?
मुझे लगता है कि दूसरा स्निपेट पढ़ने में आसान है लेकिन मुझे डर है कि यह कम कुशल है।
संपादित करें: आम तौर पर, मैं सामान्य कंटेनर कक्षाओं के लिए LargeObj
मामलों के बारे में सोच रहा हूं, तर्क के लिए, उनमें से हजारों ऑब्जेक्ट्स शामिल हैं। उदाहरण के लिए,
typedef std::vector<HugeObj> LargeObj ;
तो प्रत्यक्ष रूप से बदलाव/LargeObj
करने के तरीकों को जोड़ने के लिए एक सीधा एक्सेस समाधान नहीं है।
महान स्पष्टीकरण के लिए धन्यवाद, और "परीक्षण" वापसी मूल्य अनुकूलन के लिए कोड। मैं माइक्रोसॉफ्ट विजुअल स्टूडियो 2008 कंपाइलर पर पुष्टि कर सकता हूं जी ++ के समान परिणाम देता है - यानी, संचालन का अनुकूलित सेट है। – swongu
मेरा मानना है कि विजुअल स्टूडियो केवल आरवीओ को/ओ 2 या उच्चतर (जैसे डीबग कोड में नहीं बल्कि केवल ओ/ओ के साथ) सक्षम करेगा। – Bklyn
मैंने इसे VS2008 के साथ चेक किया, और पाया कि/ओडी (अक्षम) एक्स :: एक्स() और एक्स :: एक्स (एक्स कॉन्स एंड) कहता है, जबकि/ओ 1/ओ 2/ऑक्स केवल एक्स :: एक्स() को कॉल करता है। तो ऑप्टिमाइज़ेशन अक्षम होने के साथ, कॉपी f() के बाहर लौटने पर प्रतिलिपि की जाती है। – swongu