2012-12-06 17 views
8

मैं अधिक से अधिक सी अनुप्रयोग लिखता हूं, और अब मुझे कुछ जानवरों के बारे में आश्चर्य है। सी ++ में, एक गतिशील कास्ट एक बहुत महंगा ऑपरेशन होता है (उदाहरण के लिए डाउन-कास्ट), लेकिन मुझे स्थिर के लिए भी पता नहीं है।सी सी कास्ट वास्तव में क्या करता है?

assert (p); /* p is void* */ 
int v = *(int*)p; 

यह एक «सी गतिशील कलाकारों» है:

सी में, मैं ऐसा ही कुछ लिखने के लिए था? क्या यह सी ++ के static_cast<int*>(p) जैसा ही है? इसकी कीमत कितनी होती है?

अग्रिम धन्यवाद।

+2

... "बहुत" की उचित परिभाषाओं के लिए ... – DevSolar

+0

संभावित डुप्लिकेट [सी/सी ++ कंपाइलर्स कैसे विभिन्न मूल्य सीमाओं के प्रकारों के बीच प्रकार कास्टिंग कैसे संभालते हैं?] (https://stackoverflow.com/questions/340413/how-do-cc-compilers-handle-type-casting-between-types-with- अलग-value-ra) – jww

उत्तर

7

सी में एक कास्ट संकलन समय पर केवल सार्थक है क्योंकि यह संकलक को बताता है कि आप डेटा के एक टुकड़े को कैसे जोड़ना चाहते हैं। यह डेटा के वास्तविक मूल्य को नहीं बदलता है। उदाहरण के लिए, (int*)p संकलक को p को एक पूर्णांक के लिए स्मृति पता के रूप में वर्णित करने के लिए कहता है। हालांकि यह रन टाइम पर कुछ भी नहीं है, प्रोसेसर सिर्फ कच्चे नंबरों से संबंधित तरीके से संबंधित है।

+8

यह सभी जानवरों के लिए सही नहीं है। '(फ्लोट) 0.3' आईईईई 754 सिस्टम पर मूल्य बदलता है। यह अब '0.3' के बराबर नहीं है। –

+0

यह सच है, धन्यवाद। – jazzbassrob

8

पॉइंटर का ए सी कास्ट एक सी ++ reinterpret_cast की तरह अधिक है। यह एक चर के इलाज के लिए कंपाइलर को एक अलग प्रकार के रूप में निर्देशित करता है और रनटाइम पर कुछ भी लागत नहीं देता है।

+1

यह तब होता है जब एक पॉइंटर प्रकार से कास्टिंग होता है दूसरा, लेकिन उस स्थिति में 'reinterpret_cast' एक' static_cast' जैसा ही काम करता है। कास्टिंग, कहें, एक पूर्णांक के लिए एक डबल वास्तविक काम करता है और 'reinterpret_cast' जैसा कुछ भी नहीं है। मेरे लिए 'static_cast' की तुलना' dynamic_cast' से अधिक अनुचित दिखाई देती है। – sepp2k

+0

@ sepp2k मैंने पॉइंटर प्रकारों के बारे में अपना बिंदु शामिल करने के लिए अपना उत्तर अपडेट किया है। मुझे यकीन नहीं है कि मैं स्थिर और पुनर्विचार के बारे में आपके साथ सहमत हूं संकेतक के लिए समान है - क्या संकलक जांच नहीं करता है कि स्थैतिक प्रकार संगत प्रकारों के बीच हैं? (यह संभवतः एक स्पर्शरेखा पर जा रहा है ... मैं सहमत हूं और आपके मुख्य बिंदु की सूचना ले ली है) – simonc

+0

आप सही हैं, 'static_cast' केवल' reinterpret_cast' ** के समान है ** ** यह संकलित करता है। – sepp2k

2

पॉइंटर्स पॉइंटर्स हैं - एक पॉइंटर कास्टिंग एक नोप है।

यह पहले एक स्मृति पता था, यह बाद में एक स्मृति पता है।

यह मूलतः एक बयान है "चलो मान लें कि इस टाइप करने के लिए भविष्य प्रकार जांच के लिए एक्स एक सूचक है"।

तो आप इसे C12+ के संदर्भ में reinterpret_cast पर कॉल कर सकते हैं, क्योंकि यह संकलित समय निष्पादित करने के प्रकार को टाइप नहीं करता है। dynamic_cast या static_cast करता है।

मुझे नहीं लगता कि सी dynamic_cast ("यहां रनटाइम प्रकार की जांच डालें") या static_cast ("अतिरिक्त संकलन समय प्रकार जांच यहां करें") के समकक्ष हैं।

ध्यान दें कि गैर-पॉइंटर्स चीजें थोड़ा अलग तरीके से व्यवहार करेंगी।

int b = 1; 
double a = (double) b; 

इतना एक डाली नहीं है, लेकिन एक स्पष्ट प्रकार रूपांतरण

+0

ध्यान दें कि मानक स्पष्ट रूप से अलग-अलग चौड़ाई के विभिन्न प्रकार के पॉइंटर्स रखने का अधिकार सुरक्षित रखता है ... जबकि यह 8-बिट दो-पूरक आईईईई फ्लोट आर्किटेक्चर की आज की दुनिया में एक विदेशी मामला है, भाषा वकील आपके पीछे जा सकते हैं "नोप" टिप्पणी के लिए। ;-) – DevSolar

+0

ठीक है इसे मिला। तो यह किसी और चीज की तुलना में _compiler_ ** संकेत ** अधिक है? – phaazon

+0

वास्तव में संकलक को "संकेत" नहीं: - यह संकलक को कुछ भी अनुकूलित करने में मदद नहीं करता है। लेकिन यह एक * प्रोग्रामर * चीज है। मैं संकलक * अनुमान नहीं देता * यह सही है, लेकिन मैं * स्पष्ट रूप से बताता हूं कि यह डाला जाना चाहिए, और एक टाइपो नहीं है; यह केवल संकलक को बताता है कि यह "एक त्रुटि नहीं है, लेकिन इसका मतलब है"। –

5

ए सी कास्ट सभी सी ++ शैली की तरह dynamic_cast संयुक्त को छोड़कर अधिक है। तो जब आप किसी अन्य पूर्णांक प्रकार में int डालते हैं, तो यह static_cast है। जब आप अन्य पॉइंटर प्रकारों या पूर्णांक प्रकारों या इसके विपरीत पॉइंटर्स डालेंगे, तो यह reinterpret_cast है। यदि आप const निकाल देते हैं, तो यह const_cast है।

सी में dynamic_cast जैसा कुछ नहीं है क्योंकि इसमें ऑब्जेक्ट्स के प्रकार की अवधारणा है और उनके लिए सी ++ या तो कोई वर्चुअल फ़ंक्शंस नहीं है ...)। ऑब्जेक्ट्स बिट्स को समझने के संबंध में प्रकार केवल तब महत्वपूर्ण हो जाते हैं जब ऑब्जेक्ट्स को संदर्भित अभिव्यक्तियों के साथ संयुक्त किया जाता है। सी वस्तुओं में स्वयं के प्रकार नहीं होते हैं।

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