क्या वस्तु के जीवनकाल के दौरान `This` सूचक स्थिर है?


19

क्या thisकिसी विशेष वस्तु के जीवनकाल के दौरान पॉइंटर का मूल्य स्थिर रहने की गारंटी है? मैं एक ऐसे मामले की कल्पना नहीं कर सकता जहां यह बदल जाएगा, लेकिन यह नहीं पता कि क्या मुझे कुछ याद नहीं है।


4
thisपॉइंटर का मान हमेशा उस ऑब्जेक्ट के पते का मूल्य होता है जिस पर फ़ंक्शन को बुलाया गया था। तो यह सवाल बराबर है कि 'क्या कोई वस्तु जीवन काल में अपना मेमोरी एड्रेस बदल सकती है?'
एकांकागुआ

2
वर्थ नोटिंग: यदि कोई अनौपचारिक रूप से जीवनकाल के बारे में बात करता है, तो एक ऐसी वस्तु जिसे स्थानांतरित किया जाता है, वह संकेत std::moveको बदल देती है this। औपचारिक रूप से हम कहेंगे कि वे दो अलग-अलग वस्तुएं हैं, लेकिन अनौपचारिक रूप से कोई भी उन्हें "समान" के रूप में सोच सकता है, जो अगर ध्यान नहीं दे रहा है तो भ्रम पैदा कर सकता है।
कोरट अमोन

जवाबों:


27

क्या thisकिसी विशेष वस्तु के जीवनकाल के दौरान पॉइंटर का मूल्य स्थिर रहने की गारंटी है?

जी हां

जैसा कि उपयोगकर्ता Aconcagua इसे कहते हैं: thisसूचक का मान हमेशा उस वस्तु के पते का मूल्य होता है जिस पर फ़ंक्शन को 1 पर बुलाया गया था । तो सवाल इसके बराबर है:

क्या कोई वस्तु जीवन काल में अपना मेमोरी पता बदल सकती है?

lifetime2 की परिभाषा के अनुसार, यह संभव नहीं है । किसी वस्तु का जीवनकाल तब शुरू होता है जब उसका भंडारण प्राप्त किया जाता है या उसके बाद समाप्त होता है और जब वह छोड़ा जाता है, उससे पहले।


1) [class.this]/1

एक गैर-स्थैतिक ( [class.mfct]) सदस्य फ़ंक्शन के शरीर में , कीवर्ड thisएक प्रस्ताव है जिसका मूल्य उस ऑब्जेक्ट के लिए एक संकेतक है जिसके लिए फ़ंक्शन कहा जाता है।

2) [basic.life]/1 (जोर मेरा)

किसी वस्तु या संदर्भ का जीवनकाल वस्तु या संदर्भ का एक रनटाइम गुण है। एक वैरिएबल को यह कहा जाता है कि अगर यह डिफॉल्ट-इनिशियलाइज़्ड है और यदि यह क्लास टाइप या ए (संभवतः मल्टी-डायमेंशनल) एरे का है, तो क्लास टाइप में एक ट्रिवियल डिफॉल्ट कंस्ट्रक्टर होता है। एक प्रकार की वस्तु का जीवनकाल Tतब शुरू होता है जब :

  • प्रकार के लिएT उचित संरेखण और आकार के साथ भंडारण प्राप्त किया जाता है , और
  • इसकी आरंभीकरण (यदि कोई है) पूर्ण है (रिक्त आरंभीकरण सहित) ( [dcl.init]), सिवाय इसके कि यदि वस्तु एक संघ सदस्य है या उसके अधीन है, तो इसका जीवनकाल केवल तभी शुरू होता है जब संघ का सदस्य संघ में प्रारंभिक सदस्य ( [dcl.init.aggr], [class.base.init]), या के रूप में हो में वर्णित है [class.union]

एक oप्रकार की वस्तु का जीवनकाल Tतब समाप्त होता है जब :

  • यदि Tएक गैर-वर्ग प्रकार है, तो वस्तु नष्ट हो जाती है, या
  • यदि Tकोई वर्ग प्रकार है, तो विध्वंसक कॉल प्रारंभ होता है, या
  • वह संग्रहण जो ऑब्जेक्ट पर कब्जा करता है , जारी किया जाता है , या किसी ऑब्जेक्ट द्वारा पुन: उपयोग किया जाता है जो भीतर निहित नहीं है o( [intro.object])।

क्या इसका मतलब यह है कि सी + + प्रोग्राम के लिए स्वचालित मेमोरी संघनन को लागू करने के लिए पर्याप्त रूप से जटिल रनटाइम के लिए यह असंभव (अवैध) होगा? या इसका मतलब सिर्फ इतना है कि उसे "जैसे-अगर" व्यवहार करना होगा, ताकि thisढेर में आंदोलनों की परवाह किए बिना, हर बार समान मूल्य प्रदान किया जाए ?
अलेक्जेंडर - मोनिका

2
@ एलेक्स स्पष्ट रूप से जैसा कि नियम प्रबल है। हमेशा।
19

1
@ अलेक्जेंडर- ReinstateMonica विटेबल एक समान अवधारणा है जो प्रदर्शन को कम करती है, लेकिन यह लाभ के बाद से स्वीकार किया जाता है। आधुनिक प्रोसेसर वास्तव में अप्रत्यक्ष रूप से कुशल हैं।
मार्क रैनसम

1
@MarkRansom " एक सूचक एक वस्तु का पता होने की गारंटी है, या संकलक अविवेक की? एक स्तर जोड़ने के लिए नि: शुल्क है " परिभाषा के अनुसार कि ptr एक वस्तु का पता है, लेकिन "पता" एक उच्च स्तरीय अमूर्त अवधारणा हो सकता है । लेकिन फिर यदि आप अप्रत्यक्ष परिचय देते हैं, तो आपको एटोमिसिटी की आवश्यकता होती है, आपको लॉकिंग की आवश्यकता होती है, किसी भी वस्तु के सभी एक्सेस पर अतिरिक्त काम का एक गुच्छा चाहिए, यदि थ्रेड्स हैं। बस इसे देखने और महसूस करने के द्वारा मैं इसे असाध्य बना सकता हूं (और मैंने इस तथ्य को C / C ++ को निम्न स्तर की भाषा के रूप में दोगुना भी नहीं माना है)।
जिज्ञासु

1
@ गंभीर आप अच्छे अंक बनाते हैं, और मैं अब यह तर्क नहीं दे रहा हूं कि अप्रत्यक्ष व्यावहारिक होगा। हालांकि यह अभी भी एक अच्छा विचार प्रयोग करता है।
मार्क रैनसम

8

किसी वस्तु का भंडारण क्षेत्र होता है। thisवहाँ अंक।

[intro.object]/1

एक वस्तु अपने [class.cdtor]पूरे जीवन काल में निर्माण की अवधि ( ) में, और उसके विनाश की अवधि ( [class.cdtor]) में भंडारण के क्षेत्र में रहती है ।


-1

मान की thisगारंटी दी जाती है यदि प्रोग्राम कभी भी इसे पढ़ता है, तो स्थिर हो सकता है, यदि बाद में रीड वैल्यू के कुछ बिट्स को इकट्ठा करना असंभव है या बाद में रीड वैल्यू के कुछ बिट्स प्रोग्राम के बाहर भाग गए। अन्य सभी मामलों में, यह श्रोडिंगर की बिल्ली की तरह व्यवहार करता है, अर्थात यह एक ही समय में स्थिर और परिवर्तनशील है।


क्षमा करें, बिल्कुल समझ में नहीं आता। कचरा इकट्ठा करने और कार्यक्रम से बाहर भागने के लिए क्या है ?
डेनियल लैंगर

@DanielLangr पहचानकर्ता के मूल्य के टुकड़ेthis
atomsymbol

यह मेरे प्रश्न का उत्तर नहीं देता है। कुछ बिट्स को इकट्ठा करने के लिए कचरा क्या है? या उन्हें कार्यक्रम से बाहर भागने के लिए?
डेनियल लैंगर

@DanielLangr पाठ के एक छोटे से टुकड़े में व्याख्या करना कठिन है
परमाणु
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.