2015-07-20 8 views
13
int x = 10; 
int& y = x; 

इस के लिए, x00 2/4/8 स्टैक पर बाइट्स और ... 1010 उन बाइट्स लिखा है के रूप में आवंटित किया जाता है। मेमोरी लेआउट और इसकी सामग्री y के लिए कैसी दिखती है?सी ++ में एन्कोड किए गए संदर्भ कैसे हैं?

+4

इसे चार बाइट्स कभी नहीं मानें। यह आठ हो सकता है। संदर्भ हैं, * सैद्धांतिक रूप से *, प्रोग्रामर के लिए बस एक सुविधा। इस मामले में 'x' और' y' एक ही चीज़ हैं, बस अलग-अलग नाम हैं। अभ्यास में, कौन जानता है। यदि संकलक सोचता है कि यह सहायक है तो '10' की कई प्रतियां हो सकती हैं। याद रखें, * वेरिएबल्स * मेमोरी स्पेस पर कभी कब्जा नहीं करते हैं, केवल वे मान जो वे करते हैं। – tadman

+7

सीए ++ मानक AFAIK केवल यह निर्धारित करता है कि एक संदर्भ किसी अन्य वस्तु के लिए उपनाम होना चाहिए और इसे किसी भी विशिष्ट तरीके से कार्यान्वित करने की आवश्यकता नहीं है, इसलिए आपको इस पर भरोसा नहीं करना चाहिए। – Borgleader

+3

कि @Borgleader सच है, हालांकि वे लगातार ऑटो अपसंदर्भन संकेत – KABoissonneault

उत्तर

27

सी ++ 11 मानक 8.3.2.4 [dcl.ref]

यह अनिर्दिष्ट या नहीं, संदर्भ की आवश्यकता होती है भंडारण

से

तो यह किसी भी भंडारण की आवश्यकता हो सकती है या नहीं।

13

मुझे बोली http://en.cppreference.com/w/cpp/language/reference करते हैं:

संदर्भ वस्तुओं नहीं हैं; वे आवश्यक रूप से स्टोरेज पर कब्जा नहीं करते हैं, यद्यपि संकलक वांछित अर्थशास्त्र को लागू करने के लिए आवश्यक हो सकता है (उदाहरण के लिए संदर्भ प्रकार का एक गैर स्थैतिक डेटा सदस्य आमतौर पर कक्षा के आकार को स्टोर करने के लिए आवश्यक है एक स्मृति पता)

+0

अरे, तुमने मुझे इसे हराया :) – ydobonebi

4

सी ++ languange के परिप्रेक्ष्य से, यह परिभाषित नहीं किया गया है।

प्रैक्टिस में, कंपाइलर्स आमतौर पर पॉइंटर्स के समान संदर्भों का संदर्भ लेते हैं, भले ही उनके पास C++ में कई अलग-अलग गुण हों। इसका मतलब है कि संदर्भित चर का पता शारीरिक रूप से संग्रहीत है। शायद एकमात्र धारणा है कि संकलक कर सकता है कि संदर्भ शून्य नहीं है। इसके बावजूद, मुझे लगता है कि आप पहले पॉइंटर लेने के बिना सी ++ कोड में संदर्भ चर में संग्रहीत पते तक नहीं पहुंच सकते हैं।

ध्यान दें कि कंपाइलर अक्सर संदर्भ चर अनुकूलित कर सकता है ताकि आप यह भी कह सकें कि यह असेंबली में कहां है। और यह सूचक चर के लिए भी ऐसा ही कर सकता है।

+1

भूलें कि संदर्भ जीवनकाल बढ़ा सकते हैं; इन मामलों में, भंडारण पूरे ऑब्जेक्ट के लिए होगा: { ऑब्जेक्ट और my_object = ऑब्जेक्ट(); // my_object पूरे ब्लॉक } – Lucretiel

+0

के लिए रहता है क्या आप वाकई एक अभिव्यक्ति से परे जीवनकाल बढ़ा सकते हैं? ऐसा लगता है कि यह एक खतरनाक संदर्भ होगा। –

+0

@Lucretiel [ऐसा मत करें] (http://stackoverflow.com/questions/13826897/why-not-non-const-reference-to- समकालीन-objects) – NathanOliver

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