2010-11-06 10 views
9

संभावित डुप्लिकेट:
How to pass objects to functions in C++?
is there any specific case where pass-by-value is preferred over pass-by-const-reference in C++?क्या मूल्य या मूल डेटाटाइप के संदर्भ में पारित करना बेहतर है?

मैं एक वर्ग इस तरह कार्यान्वित की सदस्य हैं:

void aaa(int a, float b, short c) 
{ 
    bbb(a, b); 
} 

void bbb(int a, float b) 
{} 

एक के मूल्यों हैं, बी और सी थे मेरे वर्ग में स्थिरांक के रूप में संग्रहीत, तो यह उपयोग करने के लिए बेहतर/समझदार होगा मेरे कार्यों को नीचे दिखाया गया है या जैसा ऊपर दिखाया गया है?

void aaa(int& a, float& b, short& c) 
void bbb(int& a, float& b) 

संदर्भों का उपयोग करते हुए इस मामले में कोई गति लाभ या लाभ देते हैं? यहां संदर्भों के किसी भी नुकसान/उपरांत?

+1

ठीक है, उन सभी '*' के बारे में क्या हैं ?! –

+0

मुझे लगता है कि आपको प्रारूप int ** और ** को संपादित करने की आवश्यकता नहीं है :-) –

+0

तारों को स्टैक ओवरव्लो द्वारा जोड़ा गया था। वेबसाइट को तारों के बीच अक्षरों को बोल्ड में परिवर्तित करना था। इसे हटा देगा इसे परिवर्तित नहीं कर रहा है। – Nav

उत्तर

4

मानक संदर्भों के कार्यान्वयन के बारे में बाधा नहीं है, हालांकि आमतौर पर उन्हें स्वत: संदर्भित पॉइंटर्स (वास्तव में कुछ अपवादों के साथ) के रूप में लागू किया जाता है। जैसा कि आप शायद जानते हैं, 32 बिट सिस्टम पॉइंटर आकार पर 4 बाइट्स हैं, इसका मतलब है कि संदर्भों से गुजरने वाले चार्ज, शॉर्ट्स (आकार के साथ प्रकार() 4 बाइट से कम) टाइप हो सकते हैं, शायद कुछ हद तक ओवरकलिंग के रूप में माना जाता है - 1 (चार) के बजाय 4 बाइट्स का उपयोग करके या 2 (लघु)। सामान्य रूप से यह निर्भर करता है कि राइगर्स या स्टैक को पैरामीटर पास करने के लिए उपयोग किया जाता है: आप मूल्य के आधार पर मूल प्रकारों को पार करते समय थोड़ा सा स्टैक बचा सकते हैं, लेकिन रजिस्टरों के मामले में भी वर्णों के लिए, 4 बाइट्स का उपयोग किया जाएगा, इसलिए कोई बिंदु नहीं है ptrs/refs के साथ कुछ अनुकूलित करने की कोशिश में।

+0

ध्यान दें कि प्रदर्शन में एक और अंतर है: सीधे int का उपयोग करते समय, मान या तो रजिस्टर या स्टैक में मौजूद होता है, जबकि संदर्भ पारित करते समय (एक ऑटो-ड्रेन्सेन्स्ड पॉइंटर मानते हुए) वास्तविक मूल्य को अतिरिक्त के साथ पुनर्प्राप्त किया जाना चाहिए संकेत, मूल्य से गुजरने पर अनावश्यक होगा। –

+0

-1 स्टैक उपयोग के बारे में गलतफहमी का प्रचार करने के लिए। एक 'चार' पास करना, कहें, स्टैक पर, आमतौर पर 32-बिट सिस्टम पर स्टैक स्पेस के 4 बाइट्स का उपयोग करेगा। सी और सी ++ में एक ही अंतर्निहित कारण स्वचालित प्रचार में 'int' पर दिखाई देता है। संक्षेप में, स्टैक स्पेस उपयोग के पास छोटे प्रकार के लिए इसके साथ कुछ लेना देना नहीं है। इसके बजाय इसे प्रोग्रामर समय के साथ करना है, आपको कितना लिखना है और आपको कितना पढ़ने की जरूरत है, यानी प्रोग्रामर दक्षता, और इसे एक संभावित अतिरिक्त संकेत, यानी प्रोग्राम दक्षता के साथ करना है। –

+0

उह, जिन्होंने इस गलत जवाब को फिर से वोट दिया? –

3

आप संदर्भ का उपयोग करते हैं, तो उन्हें const बनाने:

void bbb(const int & a, const float & b); 

अन्यथा अर्थ विज्ञान, मूल्य से गुजर से अलग होगा समारोह चर पैरामीटर के लिए पारित का मूल्य बदल सकता है। यह इंगित करेगा कि आप तर्कों के लिए अक्षर का उपयोग नहीं कर सके।

1

मुझे यह कारण नहीं दिख रहा कि यह तेज़ क्यों होगा। आपको दोनों मामले में फ़ंक्शन को पैरामीटर भेजने की आवश्यकता है। यदि फ़ंक्शन को मूल्य के बजाय पॉइंटर मिलता है, तो पॉइंटर को ड्रेफ़्रेंसिंग की आवश्यकता होती है जो सादे मान भेजने से धीमी हो सकती है।

+0

सूचक * '' के मामले में, * संदर्भ * '' 'के मामले में, डीरफ्रेंसिंग होगी, इसमें" ओवरहेड "शामिल नहीं होगा। फ़ंक्शन तर्कों (आमतौर पर स्मृति पते का आकार) के लिए उपयोग किए जाने वाले देशी रजिस्टर से बड़े प्रकार के लिए, सिद्धांत में यह पूरी तरह से मूल्य के अनुसार संदर्भों को पारित करने के लिए बेहतर है। – rubenvb

+0

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

+0

मुझे लगता है कि हम 'int' या' float' जैसी चीज़ों के बारे में बात कर रहे हैं। हालांकि, * और और पॉइंटर-प्रकार पैरामीटर के लिए बहुत ही अलग वाक्यविन्यास है, इसलिए मुझे लगता है कि डेविड ठीक है। – tia

4

क्रमिक प्रकारों के मामले में - यानी int, float, bool, आदि - मूल्य से गुजरने के बजाय संदर्भ का उपयोग करने में कोई बचत नहीं है। SourceSource2

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

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