2014-07-09 6 views
10

सी ++ मानक से:reinterpret_cast बिट्स को संशोधित करता है कब?

5.2.10.3

मानचित्रण reinterpret_cast द्वारा किया जाता सकता है, या नहीं हो सकता है, प्रतिनिधित्व मूल मूल्य से अलग उत्पादन।

मुझे विश्वास करने और इसे दोहराने के लिए इस साइट पर प्रशिक्षित किया गया है। (भले ही यह संभवतः केवल मामूली है)। से reinterpret_castint* को एक अलग बिट पैटर्न बनाने की अनुमति है। एकमात्र गारंटी यह है कि reinterpret_cast-जिसके परिणामस्वरूप float* मूल बिट पैटर्न का उत्पादन करेगा।

मेरा प्रश्न: क्या यह कभी होता है? क्या कोई मौजूदा, वास्तविक-विश्व मंच या सीपीयू या कंपाइलर है जो वास्तव में reinterpret_cast एस को एक अलग बिट पैटर्न में है? यदि नहीं, तो क्या कोई असली दुनिया स्थितियां हैं जहां reinterpret_castकोई रनटाइम ओवरहेड है?

reinterpret_cast साथ मेरे सारे अनुभव में, डाली संकलक, नहीं क्रम के लिए एक निर्देश था।

+2

हैं ऐसा कोई मंच नहीं है, तो इस सवाल का जवाब देना मुश्किल होगा, क्योंकि मुझे संदेह है कि ऐसे लोग हैं जो आत्मविश्वास से कह सकते हैं कि "ऐसा कोई मंच नहीं है, मैं उन्हें सब जानता हूं"। हालांकि, एक पूरी तरह से hypothetical उदाहरण के रूप में, एक मशीन हो सकती है, जिसके लिए एन-बाइट मेमोरी संरेखण की आवश्यकता होती है, और पॉइंटर मूल्यों में अतिरिक्त बिट्स होती हैं, और उन बिट्स का उपयोग कुछ अतिरिक्त जानकारी को एन्कोड करने के लिए करती है, जो 'फ्लोट *' और 'int' के लिए अलग होती हैं। * '। तो यदि मानक बदलते बिट पैटर्न की अनुमति नहीं देगा, तो उस वास्तुकला पर कलाकार असंभव होगा। – hyde

उत्तर

1

मैं प्लेटफार्मों जहां char* से बड़ा int*, था पर और प्लेटफार्मों, जहां वे एक अलग लेआउट था, फिर भी आकार ही था पर काम किया है।प्रश्न में मशीनों में से कोई भी विशेष रूप से आज प्रासंगिक नहीं है, हालांकि (हालांकि दूसरा, पीडीपी -10, था अपने दिन में अधिक महत्वपूर्ण मशीनों में से एक)। यह भी कल्पना की जा सकती है कि मूल मोड (या मूल मोड कहा जाता है) में इंटेल पर कुछ संकलन मोड reinterpret_cast में पॉइंटर्स "सामान्यीकृत" या यहां तक ​​कि अंतर्निहित रूपांतरण की सुविधा के लिए, तुलनात्मक तुलना को सुविधाजनक बनाने के लिए होगा। यह भी कल्पना योग्य है (हालांकि मैंने इसे नहीं देखा है) कि रूपांतरण सही संरेखण लागू करते हैं, उदा। char*int* करने से एक रूपांतरण को आज व्यवहार में 0 पर 2 कम आदेश बिट के लिए मजबूर हो सकता है, फिर भी, मुझे नहीं लगता कि, यह है कि आप की संभावना अधिक एक reinterpret_cast डेटा सूचक के बीच कोई भी परिवर्तन करने प्रकार । मुद्दा अधिक ऐतिहासिक है। (लेकिन मैं आधुनिक एम्बेडेड प्रोसेसर के बारे में यकीन नहीं है। मैं क्या समझ से, उनमें से कई शब्द को संबोधित कर रहे हैं, और यदि ऐसा है तो sizeof(int) != sizeof(char), वे char संबोधित करने के लिए एक विशेष प्रारूप आवश्यकता होती है।)

+0

मेरे सीमित अनुभव में माइक्रोकंट्रोलर पॉइंटर्स को नहीं बदलते हैं और बदले में एक त्रुटि त्रुटि के साथ क्रैश करते हैं जब एक गलत हस्ताक्षर सूचक को संदर्भित किया जाता है। संभवतः किसी रनटाइम लागत के साथ परिवर्तन करने में असमर्थ होने के साथ ऐसा कुछ करना है। – nwp

+1

इन स्थितियों के लिए आप उल्लेख करते हैं, "' char * '' int * 'से बड़ा है," मूल मोड पॉइंटर्स को सामान्यीकृत किया जाना चाहिए "," निम्न-आदेश बिट्स को शून्य किया जाना चाहिए "- क्या इसका मतलब है कि इस प्रश्न में मेरा आधार "मूल बिट पैटर्न" उत्पन्न करने के लिए _ trip trip_ कास्टिंग गलत है? –

+0

@nwp यह स्पा सीसी या जी ++ का स्पार्क पर व्यवहार है; यह शायद बाइट एड्रेसिंग वाली मशीन पर सार्वभौमिक व्यवहार है। लेकिन क्या सभी एम्बेडेड प्रोसेसर बाइट एड्रेसिंग करते हैं? डीएसपी के बारे में क्या? यही वह जगह है जहां मुझे यकीन नहीं है। बाइट एड्रेसिंग के बिना 32 बिट डीएसपी पर 8 बिट बाइट्स को लागू करने की कोशिश करने वाला एक कंपाइलर सामान्य बिट पते को सामान्य हार्डवेयर पते के बाहर कहीं भी बाइट चुनने के लिए रखना होगा। –

5

पॉइंटर्स सिद्धांत रूप में विभिन्न आकारों में हो सकते हैं। सबसे बड़ा पॉइंटर, यदि कोई अंतर है (सदस्य पॉइंटर्स को अनदेखा करना, वास्तविक पॉइंटर्स के बारे में बात करना) char* है, तो char परिभाषा के अनुसार एक बाइट है और कहीं भी, कोई संरेखण नहीं हो सकता है। void*char* का प्रतिनिधित्व करने में सक्षम होना चाहिए।

int* के साथ char* की तुलना में कम बिट्स का उपयोग कर सिस्टम पर, उस दिशा में पुन: व्याख्या-कास्टिंग थोड़ा जोखिम भरा हो सकता है।

मुझे लगता है कि इन पॉइंटर्स (हे) के साथ आप इसे मानक में पा सकते हैं। void* किसी भी सूचक के लिए पर्याप्त होने के बारे में आवश्यकता है, और संरेखण के बारे में बात: कठोर/बड़ा, उस प्रकार के सूचक के लिए आवश्यक कम बिट्स। लेकिन मैंने कभी भी किसी भी मौजूदा प्रणाली के बारे में नहीं सुना है जहां ऐसा अंतर है।


का प्रतिनिधित्व करने में सक्षम होने के बारे में void* Standardese char*:

सी ++ 11 §3.9.2/4:


एक संकेतक सीवी -qualified को (3.9.3) या सीवी -unqualified void का उपयोग किया जा सकता है अज्ञात प्रकार की वस्तुओं को इंगित करने के लिए । ऐसा सूचक कोई ऑब्जेक्ट पॉइंटर रखने में सक्षम होगा।के प्रकार सीवीvoid* एक वस्तु सीवी के रूप में ही प्रतिनिधित्व और संरेखण आवश्यकताओं होगाchar*

“ किसी भी वस्तु सूचक ” थोड़ा तात्पर्य सूचक के विभिन्न आकारों देखते हैं कि।

सी ++ 11 §5.2.10/7:


एक वस्तु सूचक स्पष्ट रूप से एक वस्तु में बदला जा सकता


दिग्दर्शन के संरेखण के बारे में Standaredese एक अलग प्रकार के सूचक। एक prvalue "T1 सूचक" प्रकार के v "सीवी सूचकT2" प्रकार में बदल जाती है, तो परिणाम is static_cast<सीवीT2*>(static_cast<सीवीvoid*>(v)) अगर दोनों T1 और T2 मानक लेआउट प्रकार (3.9) कर रहे हैं और संरेखण T2 की आवश्यकताओं T1 की तुलना में कोई कठोर नहीं है, या यदि कोई प्रकार void है। प्रकार के prvalue परिवर्तित (जहां T1 और T2 वस्तु प्रकार के होते हैं और जहां T2 के संरेखण आवश्यकताओं कोई T1 की से अधिक सख्त कर रहे हैं) "T2 सूचक" और वापस अपने मूल प्रकार की पैदावार के लिए प्रकार को "T1 सूचक" मूल सूचक मूल्य। ऐसे किसी अन्य सूचक रूपांतरण का नतीजा अनिर्दिष्ट है। लायक टिप्पण मानक में वर्ग व्युत्पत्ति के सी-शैली अनुकरण, कि जाहिरा तौर पर ऊपर अंत में “ किसी अन्य ” के विपरीत है के लिए कुछ समर्थन है कि बाद में वहाँ

यह ’ रों:

सी ++ 11 §9.2/20,


एक मानक लेआउट struct वस्तु के लिए एक सूचक, उपयुक्त रूप से एकका उपयोग कर परिवर्तित 210, इसके प्रारंभिक सदस्य (या यदि वह सदस्य थोड़ा-फ़ील्ड है, तो उस इकाई में जहां यह रहता है) और इसके विपरीत।

इस मामले दो वस्तुओं जरूरी एक ही संरेखण है, जबकि पिछले उद्धृत पैरा केवल प्रकार – के संरेखण लेकिन स्पष्ट रूप से औपचारिक थोड़ा विरोधाभास के बारे में बात एक व्यावहारिक समस्या है, के रूप में मैं इसे देख नहीं है।

+2

मैंने मिल सीपीयू के बारे में एक चर्चा में भाग लिया जहां टीम के एक सदस्य ने कहा कि इवान गोडार्ड एक "फ़्लोटिंग पॉइंटर" प्रतिनिधित्व पर काम कर रहा था जो * कुछ * सीमाओं के बाहर * का पता लगाने की अनुमति देगा। इस मामले में, सूचक के आंतरिक प्रतिनिधित्व (सीपीयू में) सीमा को व्यक्त करने के लिए अप्रयुक्त बिट्स का उपयोग करेगा (किसी भी तरह)। चर्चा में यह स्पष्ट नहीं था कि वे कितने दूर थे, और क्या यह सीपीयू के बाहर पहुंच योग्य होगा, लेकिन कम से कम वे इसके बारे में सोच रहे हैं। –

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