2015-12-11 9 views
5

lvalues, rvalues और उनके लिए स्मृति आवंटन सीखने की कोशिश कर रहा है। तो बहुत सी सीखने वाली सामग्री के साथ अराजकता थोड़ी सी है।स्मृति में संग्रहीत सी ++ में कितने रैल्यू?

एक rvalue एक ऐसा मान है जो केवल उस अभिव्यक्ति की सीमाओं में मौजूद होना चाहिए जहां इसे बनाया गया था (कम से कम C++ 11 तक)। तो इसमें स्मृति का एक पता और ब्लॉक है जो यह कब्जा करता है। लेकिन परिभाषा के अनुसार हमें rvalue का पता नहीं मिल सकता है, क्योंकि यह lvalue के विपरीत एक अस्थायी वस्तु है। लेकिन सी ++ 11 से पहले भी हम इसे rvalue का पता किसी फ़ंक्शन से वापस करके और इसे एक कॉन्स्ट संदर्भ प्रकार में सहेजकर प्राप्त कर पाए थे (ओह, मुझे लगता है कि कोई पता नहीं बल्कि एक मान है)।

तो, अधिक सटीक, rvalue आवंटन कार्य कैसे करता है? प्रोग्राम या ओएस कितनी देर तक स्मृति की उस जगह को याद रखता है जहां rvalue बनाया गया था और आवंटित के रूप में चिह्नित किया गया था और कोई अन्य वस्तु अपना स्थान नहीं ले सकती है?

मैं इसे कैसे देखता हूं, अब rvalueslvalues जैसा संग्रहीत किया जाता है लेकिन हमारे पास बस उन्हें एक्सेस करने के अन्य अधिकार हैं। और उनके पास अन्य प्रकार के डीलोकेशन हैं - lvalues के लिए दायरे से बाहर निकलने के लिए rvalues अभिव्यक्ति की सीमाओं में अस्तित्व में अनुकूलित किया जा सकता है या जब तक इसके कोई और लिंक नहीं हो जाते हैं।

+4

लाइवल और रावल अभिव्यक्ति श्रेणियां हैं। वे किसी भी भंडारण का उपयोग नहीं करते हैं। स्टोरेज का उपयोग * ऑब्जेक्ट्स * क्या है। (और कभी-कभी, संदर्भ)। प्रतीत होता है कि आप "अस्थायी वस्तु" का अर्थ रखते हैं तो आप "रावल्यू" लिख रहे हैं। –

+0

मुझे नहीं लगता कि रावलों को बिल्कुल पता होना चाहिए। उनका पंजीकरण केवल रजिस्टरों में किया जा सकता है। –

+0

@ एमएम, आप सही हैं। –

उत्तर

5

संक्षिप्त उत्तर: यह कार्यान्वयन निर्भर है।

इसके पीछे मुख्य तर्क आपके कोड के प्रदर्शन में सुधार करने के लिए हमेशा संकलक के लिए स्वतंत्रता है। इसे समझने का एक और ठोस तरीका यह याद रखना है कि एक मूल्य आपके सीपीयू के रजिस्टर में संग्रहीत किया जा सकता है और वास्तव में आपकी स्मृति में कभी भी नहीं हो सकता है जिसका मतलब है कि मूल्य का कोई पता नहीं है। मैं जो कुछ भी उसके पास रखता हूं वह शर्त नहीं लगाऊंगा, लेकिन शायद यह मुख्य कारणों में से एक है कि "हमें एक रावलू का पता नहीं मिल सकता"।

एक सामान्य तरीके से एक रैल्यू अर्थात् अस्थायी रूप से अस्थायी रूप से अस्थायी स्थानों में रखा जा सकता है या इस तरह अनुकूलित किया जा सकता है जहां इसे किसी पते पर आसानी से मैप नहीं किया जा सकता है और भले ही यह काउंटर उत्पादक हो प्रदर्शन की शर्तें।

4

संकल्पनात्मक रूप से, राजस्व "ढेर" पर रहते हैं। यदि आप उनके पते पर जाते हैं, तो यह अवधारणात्मक रूप से ढेर पर एक पता है। यदि पता बिल्कुल नहीं लिया जाता है, तब तक इकाई वास्तव में अस्तित्व में नहीं आ सकती है जब तक कि संकलक जैसे दिखाई देने के लिए सही निर्देश सेट करता है।

भले ही इकाई वास्तव में बनाई गई हो, जहां वास्तव में यह रहता है वहां विभिन्न चीजों पर निर्भर करता है और यह भी ढेर पर नहीं हो सकता है: यह वर्तमान स्टैक फ्रेम में हो सकता है लेकिन यह एक अन्य ढेर फ्रेम भी हो सकता है या कुछ नियमन में यदि रावल्यू की प्रतिलिपि बनाई जाती है तो वहां कॉपी/स्थानांतरित किया जाता है और संकलक कॉपी-एलिशन करता है। यदि रावल्यू const& तक बाध्य हो जाता है तो यह कहीं और भी रहता है, अगर ऐसा नहीं होता है।

रावल का जीवनकाल भाषा नियमों से बंधे हैं। वास्तव में इसे कैसे कार्यान्वित किया जाता है वह संकलक और/या एबीआई का पालन करता है जो इसका पालन करता है।

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