2011-10-02 18 views
11

पासिंग तर्क वहाँ संदर्भ कार्यों स्थिरांक द्वारा अपने तर्कों पारित करने के लिए इनलाइन की आवश्यकता प्रदर्शन वार तरहइनलाइन फंक्शन

foo(const T & a, const T &b) 

मूल्य

foo(T a, T b) 

द्वारा अगर की तुलना में है मैं फ़ंक्शन में ए और बी के मानों को नहीं बदलता? क्या सी ++ 11 परिवर्तन कुछ विशिष्ट की सिफारिश करता है?

+2

एक मूल्य एक मान है और संदर्भ एक संदर्भ है।एक मूल्य को पारित करने के अर्थस्वरूप एक कॉन्स संदर्भ पास करना एक गलती है जो बुरी तरह से काट सकती है। Http://stackoverflow.com/questions/4705593/int-vs-const-int/4705871#4705871 – 6502

+0

@ 6502 देखें: यह एक ऐसे मामले का एक शानदार उदाहरण है जहां संदर्भ का उपयोग तर्क को अधिक जटिल बनाता है ('v.push_back (v [0]) 'कानूनी है, क्योंकि मानक पुस्तकालय में उस अतिरिक्त तर्क शामिल होना चाहिए)। –

+0

@BenVoigt: यह अनुरोध देखने के लिए अच्छा है मानक में जोड़ा गया है। यह कहां कहा जाता है? – 6502

उत्तर

11

मूल्य से गुजरने पर प्रतिलिपि एक कॉलर हो सकता है अगर तर्क अस्थायी है।

कॉन्स्ट संदर्भ द्वारा आदिम प्रकारों को पास करने पर फ़ंक्शन को रेखांकित करने पर कोई कीमत नहीं होगी। लेकिन मूल्य से जटिल लैवल्यू पास करने से संभावित रूप से महंगे प्रतिलिपि कन्स्ट्रक्टर कॉल लगाया जाएगा। तो कॉन्स संदर्भ से गुजरना पसंद करते हैं (यदि एलियासिंग कोई समस्या नहीं है)।

+0

एलियासिंग समस्याओं के अलावा जीवन भर की समस्याएं हैं। – 6502

+0

@ 6502: वापसी मूल्यों पर, निश्चित रूप से। पैरामीटर के लिए, आजीवन मुद्दे हो सकते हैं, लेकिन वे बहुत दुर्लभ हैं। और मैं उन्हें अलियासिंग मुद्दों का एक सबसेट मानता हूं। –

+0

@BenVoigt 'कॉन्स्ट संदर्भ द्वारा आदिम प्रकारों को पास करने के लिए कोई लागत नहीं होगी जब फ़ंक्शन को रेखांकित किया जाता है।' क्या आपका मतलब है, "लागत की अवधि में कोई लाभ नहीं होगा"? क्या आप पुष्टि कर सकते हैं कि फ़ंक्शन को रेखांकित करते समय 'const int 'या' const int 'को पारित करने के लिए कुछ भी है या नहीं? – Antonio

1

संदर्भ द्वारा पास डेटा प्रकार के आधार पर मूल्य से तेज़ है।
हालांकि इनलाइन फ़ंक्शंस फ़ंक्शन बॉडी (और इस प्रकार सभी संदर्भ/मूल्यों में पारित) को कोड की रेखा में जोड़ा जाता है, जिसे वे किसी भी तरह से उपयोग में लाए जाते हैं, इसलिए तकनीकी रूप से कोई चर नहीं हो रहा है, उसी क्षेत्र में कोड की केवल अधिक पंक्तियां ।

संदर्भ http://www.cprogramming.com/tutorial/lesson13.html

वहाँ भी प्रश्न should-i-take-arguments-to-inline-functions-by-reference-or-value

  • उदाहरण हो सकता है गुमराह किया गया के तहत एक बहुत ही उपयोगी जवाब है, हटा दिया है -
+1

यह पूरी तरह से अटकलें है। – pmr

+1

संदर्भ द्वारा उत्तीर्ण करना ** ** के आधार पर मूल्य से तेज़ है। इसके अलावा संदर्भ में उपयोग करने वाले कोड में अतिरिक्त आवश्यकताएं होती हैं (एलियासिंग को सही ढंग से संभालने के लिए) और मूल्य के द्वारा पारित मूल प्रकारों के लिए आवश्यक अतिरिक्त संकेत की आवश्यकता हो सकती है। – 6502

+0

क्षमाप्रार्थी, मुझे कुछ अजीब कारणों के लिए मूल्य के साथ मिश्रित पॉइंटर द्वारा पास किया गया, आप सही हैं कि यह कुछ डेटा प्रकारों के लिए केवल तेज़ है। मैं आपको यह भी बताता हूं कि http://stackoverflow.com/questions/722257/should-i-take-arguments-to-inline-functions-by-reference-or-value जो मेरे बिंदु – Serdalis

4

संदर्भ के बिना सैद्धांतिक रूप से लोगों में कॉपी किया जा सकता है स्मृति क्योंकि संभावना है कि आपका इनलाइन फ़ंक्शन उन्हें संशोधित कर सकता है (भले ही यह वास्तव में नहीं है)।

कई मामलों में संकलक उस तरह की चीज़ों को चुनने के लिए पर्याप्त स्मार्ट है लेकिन यह संकलक और अनुकूलन सेटिंग्स पर निर्भर करेगा। इसके अलावा यदि आपका फ़ंक्शन कक्षा चर में किसी भी गैर-कॉन्स्ट सदस्य फ़ंक्शन पर कॉल करता है तो आपके कंपाइलर को यह जांचने के लिए पर्याप्त स्मार्ट होना होगा कि वे कुछ भी संशोधित कर रहे हैं या नहीं।

एक कॉन्स संदर्भ का उपयोग करके आप मूल रूप से इसे एक स्पष्ट स्पष्ट संकेत दे सकते हैं।

संपादित करें: मैं बस एक साधारण test program के लिए मशीन कोड को देखने के लिए डीसीसी में जीसीसी 4.6 के साथ संकलित किया गया। जेनरेट कोड समान लग रहा था, इसलिए यह अनुकूलित किया गया प्रतीत होता है। यह अभी भी अच्छा अभ्यास है हालांकि अन्य कंपाइलरों के लिए और यदि कुछ भी कोड के इरादे का स्पष्ट संकेत नहीं देता है। यह भी संभव है कि जटिल परिस्थितियां हों कि संकलक हालांकि अनुकूलित नहीं कर सकता है।

भी llvm online dissembler demo दिखाता है कि समान बिटकोड भी उत्पन्न होता है। यदि आप अनुकूलन बंद करते हैं तो यह कॉन्स्ट संदर्भ के बिना थोड़ा लंबा है।
* 1 9 64 बाइट्स - कोई कॉन्स्ट संदर्भ (और फ़ंक्शंस/पैरामीटर पर कोई अन्य आधार नहीं)
* 1 9 60 बाइट्स - बस कोई कॉन्स्ट संदर्भ नहीं बल्कि अन्य consts।
* 1856 बाइट्स - कॉन्स और कॉन्स्ट संदर्भ के साथ।

+1

का समर्थन करता है यदि इनलाइन फ़ंक्शन ए और बी पास करता है किसी अन्य कार्य के लिए, प्रतिलिपि को अनुकूलित करना संभव नहीं हो सकता है। उदाहरण के लिए, यदि इनलाइन फ़ंक्शन गैर-इनलाइन फ़ंक्शन 'बार (ए)' को कॉल करता है तो संकलक को प्रतिलिपि बनाना चाहिए क्योंकि बार 'if (& a == और विशेष) ...' हो सकता है और मूल कॉलर 'विशेष' पारित हो सकता है। –

+0

गैर-पीओडी प्रकार के साथ पुनः प्रयास करें। –

+0

यदि कोई सदस्य फ़ंक्शन घोषित किया गया है या नहीं, तो यह अनुकूलक के लिए कोई फर्क नहीं पड़ता।ऑप्टिमाइज़र के लिए कॉन्स्ट-क्वालिटी अदृश्य है और कुछ ऐसा है जो केवल प्रोग्रामर की मदद करने के लिए डिज़ाइन किया गया है (अगर आप कॉन्स्टाइल-टाइम त्रुटियों को देकर कॉन्फ़िगरेशन का उल्लंघन करते हैं), ऑप्टिमाइज़र नहीं। – 6502

संबंधित मुद्दे