2011-03-06 21 views
10

का उपयोग कर आउटपुट लोकेशन बनाम संदर्भ का संदर्भ पास करना जो एक साधारण डेटाटाइप प्रदान करने वाले फ़ंक्शन को कॉल करते समय प्रदर्शन के लिए बेहतर है - इसे मेमोरी लोकेशन (पॉइंटर द्वारा पारित) में भरने या इसे सरल डेटा लौटने के बाद?रिटर्न

मैं यहाँ 5 का एक स्थिर मान लौटने उदाहरण oversimplified है, लेकिन देखने/कार्यक्षमता निर्धारित करता है कि वापसी मान वास्तविक जीवन में गतिशील होगा ...

परम्परागत तर्क मुझे पहले दृष्टिकोण कहते थे मान तेजी से है क्योंकि हम दूसरी प्रतिलिपि में एक प्रतिलिपि वापस करने के बजाय संदर्भ द्वारा परिचालन कर रहे हैं ... लेकिन, मुझे दूसरों की राय चाहिए।

धन्यवाद

void func(int *a) { *a = 5; }

या ...

int func() { return 5; }

उत्तर

8

सामान्य रूप से, यदि आपका फ़ंक्शन किसी फ़ंक्शन की तरह कार्य करता है (यानी, एक लॉजिकल वैल्यू लौटा रहा है), तो शायद int func() का उपयोग करना सबसे अच्छा है। यहां तक ​​कि यदि रिटर्न वैल्यू एक जटिल सी ++ ऑब्जेक्ट है, तो Return Value Optimisation नामक एक सामान्य अनुकूलन है जो अनावश्यक ऑब्जेक्ट प्रतिलिपि से बचाता है और दो रूपों को लगभग रनटाइम प्रदर्शन में बराबर बनाता है।

1

यह एक निम्न स्तर बात है, जहां यह कोई अंतर देखने के लिए मुश्किल होगा है।

4

अधिकांश कंपाइलर एक रजिस्टर में एक मूल्य वापस लौटाएंगे जब तक कि आप जो भी लौट रहे हैं वह रजिस्टर में फिट होने के लिए पर्याप्त छोटा है। इससे कहीं अधिक कुशल होने के लिए यह कुछ असामान्य (और अक्सर असंभव) है।

1

आसान उत्तर: यह निर्भर करता है।

यह प्रकार पर निर्भर करता है इस्तेमाल किया जा रहा हैं, चाहे वे सस्ते में है या नहीं (या बिल्कुल) कॉपी किया जा सकता, संकलक कुछ परिस्थितियों में RVO का उपयोग करें या नहीं कर सकते हैं, इनलाइन बातें एक या किसी अन्य के साथ बेहतर ...

संदर्भ में समझ में क्या आता है इसका उपयोग करें।

2

मेरी राय में, हमेशा return के साथ जाएं जबतक कि आप किसी कारण से नहीं जानते हैं, या आपको फ़ंक्शन से एक से अधिक मान वापस करना होगा। एक अंतर्निहित प्रकार लौटाना बहुत ही कुशल है, और जो कुछ भी बनाम बनाम सूचक के माध्यम से लौट रहा है, यह नगण्य होना चाहिए। लेकिन यहां वास्तविक लाभ return का उपयोग कर रहा है जो कोड को बाद में पढ़ने वाले लोगों के लिए स्पष्ट और सरल है।

2

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

3

पीओडी के लिए, कोई या लगभग कोई फर्क नहीं पड़ता है और मैं हमेशा वापसी मूल्य के साथ जाता हूं क्योंकि मुझे उन क्लीनर और पढ़ने में आसान लगता है।

गैर-पीओडी के लिए उत्तर "यह निर्भर करता है" - बहुत से कंपाइलर इस प्रकार के परिदृश्य में रिटर्न वैल्यू ऑप्टिमाइज़ेशन का उपयोग करते हैं जो एक अंतर्निहित संदर्भ पैरामीटर तैयार करता है।

हालांकि जब तक आप "पता नहीं" मापते हैं - लेकिन वास्तव में एक प्रोफाइलर के साथ मापा जाता है - जो कि रिटर्न वैल्यू का उपयोग करके फ़ंक्शन के परिणाम लौटाता है, वास्तव में आपके सॉफ़्टवेयर में एक बाधा है, कोड के अधिक पठनीय संस्करण के लिए जाएं ।

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