2011-07-18 12 views
22

C++C++ संदर्भ और सूचक

class bar 
{ 
    int i; 
    char b; 
    float d; 
}; 

void foo (bar arg); 
void foo (bar &arg); 
void foo (bar *arg); 

यह एक नमूना वर्ग/struct और कार्यों
है द्वारा तर्क गुजर मैं कुछ Qs

  • क्या 1 और गुजर के 2 रास्ता के बीच का अंतर है 'asm', आकार, गति में तर्क?
  • प्रत्येक मामले में फू को फ़ंक्शन को कैसे पारित किया जाता है (पॉइंटर के मामले में मुझे पता है कि पॉइंटर स्टैक पर धक्का दिया जाता है)
  • तर्कों को पार करते समय, गति (आकार, प्राथमिकता) पर दक्षता के संदर्भ में, बेहतर है ?
  • इंटेल 'एएसएम' वाक्यविन्यास क्या है जो तर्क पारित करने के प्रत्येक तरीके से मेल खाता है?

मुझे पता है कि "आधुनिक कंपाइलर्स और सीपीयू पर कोई फर्क नहीं पड़ता" के बारे में सबसे ज्यादा क्या कहना है, लेकिन अगर हम पुराने CPUs या compilers के बारे में बात कर रहे हैं तो क्या होगा? (गति, स्मृति के उपयोग और उत्पन्न कोड में दोनों) अग्रिम

+1

सीपीयू कोई फर्क नहीं पड़ता। मूल्य से गुजरने के लिए सभी के लिए अधिक काम शामिल है लेकिन सूचक के आकार से छोटे प्रकार के होते हैं। Cnicutar से जवाब देखें। –

+0

यह आधुनिक सीपीयू के साथ-साथ पुराने सीपीयू पर भी महत्वपूर्ण है।ध्यान दें कि x86 अपने पुराने सुधारों के साथ एक पुराना सीपीयू भी है, इसमें पुरानी स्कूल के सामान की उचित मात्रा है जिसे इसे विशेष रूप से इस विषय से संबंधित करना है। Cnicutar के पास इतना अच्छा जवाब है कि यह दोहराना या rephrasing लायक नहीं है। –

उत्तर

21

सूचक में

धन्यवाद और संदर्भ तरीकों काफी तुलनीय होना चाहिए।

कक्षा उत्तीर्ण करने से संकलक को स्मृति को डुप्लिकेट करने के लिए मजबूर किया जाता है और स्टैक पर bar ऑब्जेक्ट की एक प्रति डाल दी जाती है। इससे भी बदतर बात यह है कि सी ++ में इस तरह से जुड़े सभी प्रकार के गंदे बिट्स (डिफ़ॉल्ट प्रतिलिपि कन्स्ट्रक्टर और व्हाट्नॉट) हैं।

सी में मैं हमेशा (संभावित रूप से कॉन्स्ट) पॉइंटर्स का उपयोग करता हूं। सी ++ में आपको संभावित संदर्भों का उपयोग करना चाहिए।

+1

सिर्फ तुलनीय नहीं है, लेकिन सटीक वही है। ए * संदर्भ * एक * संकेतक * का एक * सिंटेक्टिक * संस्करण है। –

+3

यहां उल्लिखित मतभेदों को छोड़कर: http://stackoverflow.com/questions/57483/what-are-the-differences-between-pointer-variable-and-reference-variable-in-c –

+2

@edA: कृपया एक प्रदान करें मानक से उद्धरण जो साबित करता है "एक संदर्भ सिर्फ एक सूचक का एक वाक्य रचनात्मक संस्करण है।" – fredoverflow

1

संदर्भ द्वारा गुजरने वाले किसी भी उचित तरीके से संभवतः ऑब्जेक्ट के पते को शामिल करने वाले कोड में परिणाम होगा। हालांकि, मुख्य मुद्दा यह है कि संदर्भों का उपयोग करना अधिक idiomatic C++ है और पसंदीदा शैली होना चाहिए; आपको वास्तव में अपने कोड में कच्चे पॉइंटर्स को बहुत कुछ नहीं देखना चाहिए।

यह भी ध्यान रखें कि मूल्य और संदर्भ द्वारा गुजरने से इस अर्थ में मौलिक रूप से भिन्न होता है कि संदर्भ से गुजरने से कैली को तर्क को संशोधित करने की अनुमति मिलती है। यदि कुछ भी है, तो आपको की तुलना f(const bar &) से की जानी चाहिए।

1

पॉइंटर्स और संदर्भ वाक्य रचनात्मक रूप से भिन्न होते हैं, और आमतौर पर रनटाइम और कोड जनरेशन में समान होते हैं। पुराने कंपाइलर्स के रूप में ... मुझे बोर्लैंड 3 सी ++ डॉस कंपाइलर में एक बग पता था: यह एक रजिस्टर में एक इंट वैल्यू (संदर्भ द्वारा पारित) कैश किया गया था, इसे संशोधित किया और मूल मान को स्मृति में नहीं बदला। सूचक द्वारा पारित होने पर एक समकक्ष कोड अपेक्षा के अनुसार काम करता है।

हालांकि, मुझे नहीं लगता कि किसी भी आधुनिक संकलक ऐसे विचित्र बातें कर सकते हैं (और बोर्लेन्ड 5 समस्या का समाधान हो गया है) (संकेत से अलग बनाम तालमेल smartpointers)

कोड शैली के रूप में, मैं आम तौर पर संदर्भ का उपयोग यदि पता फ़ंक्शन अनुबंध द्वारा NULL नहीं हो सकता है, और अन्यथा पॉइंटर्स का उपयोग करें।

+2

बोर्लैंड 3? यह इतना पुराना है कि मुझे यकीन नहीं है कि यह रंग मॉनीटर का भी समर्थन करता है। – MSalters

+1

@MSalters: यह रंग _text_ मॉनीटर का समर्थन करता है .. और यहां तक ​​कि सी ++ संदर्भ ... कुछ विशिष्ट तरीके से :) – user396672

0

फ़ंक्शन फ़ू 2 और 3 मामलों में तर्क संशोधित कर सकता है। पहले मामलों में संकलक कॉपी निर्माण को अनुकूलित कर सकता है, इसलिए सीपीयू और मेमोरी उपयोग की तुलना करना बहुत मुश्किल है।