2013-06-13 20 views
9

मैं संकेत और संदर्भ के बारे में सीख रहा हूँ, और मेरे सवाल का विशेष अगले भाग में, this स्पष्टीकरण को दर्शाता है:क्या कोई संदर्भ स्मृति में एक नया स्थान या मौजूदा सेल के लिए उपनाम बनाता है?

यह पता चलता है कि घोषणा int& ri = i एक नया स्मृति सेल, जिनमें से एक मूल्य है बनाता है &i और अज्ञात स्मृति स्थान में मौजूद है।

इस सिद्धांत का परीक्षण करने के लिए, मैं एक साधारण मामला लिखा था, जिसके परिणामस्वरूप नीचे देखा जाता है:

enter image description here

मैं तथ्य यह है कि r और i उसी स्मृति पता है, जो लगता है है से हैरान हूँ रीडिंग का खंडन करें। नतीजे बताते हैं कि int& ri = i का अर्थ है "मेमोरी सेल i के लिए उपनाम बनाएं और इसे r पर कॉल करें" जैसे कि दोनों एक ही सेल को संदर्भित करते हैं।

क्या दस्तावेज़ सही है, या क्या मुझे कुछ याद आया है?

+0

मुझे यह एक डुप्लिकेट नहीं लगता है, मैं पूछ रहा हूं कि संदर्भ वास्तव में स्मृति में एक सेल पर कब्जा करता है, न कि यह पता प्राप्त किया जा सकता है या नहीं। इसमे अंतर है। – jesterII

+1

प्रश्न एक जैसा नहीं हो सकता है, लेकिन मुझे लगता है कि उत्तर इस पर लागू होते हैं। – juanchopanza

उत्तर

10

r के बाद से, i लिए एक संदर्भ है r पर सभी कार्यों i पर संचालन में संकलक से बदल रहे हैं। । वे हमेशा एक ही बात का संदर्भ - - तो &r कर रही है, आप स्मृति पता i में है देता है

(कि नोट संकेत के विपरीत, संदर्भ नहीं किया जा रहा 'फिर से संदर्भित' घोषित करने के बाद की संपत्ति है तो वहाँ कोई रास्ता नहीं है उन संदर्भों को लिखने के लिए जो संदर्भ में 'संदर्भित' पर काम करते हैं, 'संदर्भित' पर '

+0

'आर' के स्मृति स्थान को प्राप्त करना संभव होगा? – jesterII

+9

@jesterII प्रश्न पूछना भी संभव नहीं है। इस बात की कोई गारंटी नहीं है कि संदर्भ में एक पता है, इसे संकलक द्वारा अस्तित्व से अनुकूलित किया जा सकता है (एक सूचक के विपरीत जो कहीं होना चाहिए) – Patashu

2

दस्तावेज़ कहता है "दोनों पीआई और री में पते हैं जो मेरे स्थान पर इंगित करते हैं, लेकिन अंतर में मौजूद है संदर्भ और पॉइंटर्स जब वे अभिव्यक्तियों में उपयोग किया जाता है। ", जो सच है।

आपने लिखा "[संदर्भ] ढीला मतलब है" स्मृति कक्ष के लिए उपनाम बनाएं और इसे आर कहते हैं "जैसे कि दोनों एक ही सेल को संदर्भित करते हैं" जो भी सच है।

शायद आपने दस्तावेज़ को गलत समझा है, तो आप सही हैं और दस्तावेज़ भी है।

0

मुझे लगता है कि this SO post आपकी मदद कर सकता है। एक जवाब दी हवाला देते हुए:

एक संदर्भ एक अंतर्निहित सूचक है। असल में आप संदर्भ बिंदु संदर्भ बिंदुओं को बदल सकते हैं लेकिन आप संदर्भ को पर इंगित करने के लिए संदर्भ को बदल नहीं सकते हैं।

मुझे यकीन नहीं है कि "मेमोरी सेल" का क्या मतलब है। असेंबली में अपना कोड देखकर आप निम्न स्तर के अर्थशास्त्र को समझने में मदद कर सकते हैं। चूंकि आप विंडोज़ का उपयोग करते हुए प्रतीत होते हैं, इसलिए मैं सुझाव दूंगा कि अगर आप ऑलिली डीबीजी में अपना ऐप चलाने के लिए पर्याप्त उत्सुक हैं।

मेरा ले (और मैं बहुत गलत हो सकता है) यह है कि संकलक एक परिवर्तनीय सूचक के रूप में पीआई का इलाज करता है, जबकि ri एक अपरिवर्तनीय सूचक है।

+1

मुझे लगता है कि इस मामले में असेंबली को देखकर भ्रमित हो सकता है: संकलक को आवश्यकता हो सकती है कुछ परिस्थितियों में संदर्भ लागू करने के लिए भंडारण, और दूसरों में नहीं। अर्थात्, एक संदर्भ सिर्फ एक उपनाम है, इसलिए इसे प्रति स्टोरेज की आवश्यकता नहीं है। – juanchopanza

0

आर स्वतंत्र संदर्भ (अवधारणा) या i के लिए सिर्फ एक और नाम है।उनमें से किसी भी बदलाव में किए गए परिवर्तन एक-दूसरे में दिखाई देंगे।

7

सी ++ 11 §8.3.2/4

It is unspecified whether or not a reference requires storage. 

एक lvalue संदर्भ (T&) यदि आप एक मौजूदा स्मृति स्थान के लिए एक वैचारिक उपनाम बना घोषित करने से। कंपाइलर 'as if' नियम का इलाज कर सकता है जैसा कि यह चाहता है। यह एक सूचक बना सकता है, यह सीधे स्मृति तक पहुंच सकता है, लेकिन आपको परवाह नहीं करना चाहिए कि इसे कैसे कार्यान्वित किया जाएगा।

जो पीडीएफ आप पढ़ रहे हैं वह लालू संदर्भों के संभावित कार्यान्वयन का वर्णन करता है लेकिन सामान्य स्थिति में गलत है। लैवल्यू संदर्भों के लिए एक अच्छा दिमाग मॉडल एक ही चर के लिए दूसरा नाम दे रहा है, ताकि आप एक ही डेटा को कई अलग-अलग नामों (और स्कॉप्स) के माध्यम से एक्सेस कर सकें।

इसके अलावा, आप रैवल्यू के लिए पॉइंटर का पता नहीं ले सकते हैं या नहीं बना सकते हैं, लेकिन आप इसके लिए एक रैल्यू संदर्भ बना सकते हैं।

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