2009-04-17 8 views
7

क्या यह सच है कि const_cast संकलक को बताने का एक तरीका है "इसे रोकना बंद करें, इसे गैर-कॉन्स्ट पॉइंटर के रूप में देखें"? क्या कोई समस्या है जब const_cast का अनुवाद वास्तविक मशीन कोड में किया गया है?क्या const_cast कभी भी वास्तविक कोड उत्सर्जन का कारण बनता है?

+1

हाँ, यह सच है। – user51568

उत्तर

5

निश्चित रूप से, ऐसे आर्किटेक्चर हो सकते हैं जहां एक कॉन्स्ट पॉइंटर का गैर-कॉन्स एक अलग प्रतिनिधित्व होता है, जिस स्थिति में कंपाइलर को कुछ कोड उत्सर्जित करना होगा। हालांकि, मुझे ऐसे किसी भी आर्किटेक्चर से अवगत नहीं है।

+0

चालाक, लेकिन सत्य नहीं: कॉन्स्ट केवल विशेषता है, इसका मतलब यह नहीं है कि आप लिख नहीं सकते (म्यूटेबल सदस्यों पर विचार करें)। यदि आप एक आर्किटेक्चर की कल्पना कर रहे हैं जहां केवल पढ़ने-पढ़ने और पढ़ने-लिखने या लिखने-केवल पॉइंटर्स अलग हैं, तो कोड अभी भी लिखने के बजाय कलाकारों पर नहीं बनाया जाएगा। – Suma

+1

मैंने जानबूझकर यह नहीं कहा था कि कंपाइलर को कुछ कोड उत्सर्जित करना होगा। –

+1

कोई फर्क नहीं पड़ता। कॉन्स्ट_कास्ट वाउड पॉइंटर में काल्पनिक "केवल-पढ़ने वाला बिट" हटा देता है, जैसा एक कॉन्स्ट पॉइंटर के माध्यम से एक परिवर्तनीय सदस्य को लिखता है। उत्तरार्द्ध संकलक द्वारा 100% शुद्धता के साथ पता लगाया जा सकता है। – MSalters

12

नहीं, यह संकलन समय पर केवल कॉन्स विशेषता को हटा देता है।

3

const_cast सिर्फ एक विशेषता की स्थिरता को फेंक देता है और कुछ भी नहीं।

2

const किसी प्रकार का प्रतिनिधित्व नहीं करता है, विशेष रूप से, T* का प्रतिनिधित्व T const* जैसा ही है।

पर विचार करें:

int i, 
    * const cpi = &i, 
    * const * pcpi = &cpi; 
int const * const * pcpci = pcpi; // cpi is now int const* 

एक ही समय में cpi का प्रतिनिधित्व एक int* और *pcpci के माध्यम से एक int const* प्रतिनिधित्व करता है।

pcpci को प्रारंभ करने के लिए cpi के प्रतिनिधित्व के लिए कोई रास्ता नहीं है।

बेशक, अगर पॉइंटर ऑब्जेक्ट्स में गैर-महत्वपूर्ण बिट्स हैं, तो कंपाइलर उन्हें यादृच्छिक रूप से फ़्लिप कर सकता है; विशेष रूप से, const_cast एक सूचक के गैर-महत्वपूर्ण बिट्स को फ़्लिप कर सकता है, लेकिन कोई भी अंतर्निहित रूपांतरण भी हो सकता है। मुझे नहीं लगता कि यह मामला वास्तविक दुनिया में मौजूद है।

वही लागू होता है जब दो अलग-अलग बिट पैटर्न के परिणामस्वरूप एक ही पता मूल्य होता है (ऑफसेट होने पर बेस + ऑफसेट पर्याप्त होता है)।

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