2010-08-26 16 views
33

मेरी समझ यह है कि सी ++ reinterpret_cast और सी पॉइंटर कास्ट सिर्फ संकलन-समय कार्यक्षमता है और इसकी कोई प्रदर्शन लागत नहीं है।reinterpret_cast कास्ट लागत

क्या यह सच है?

उत्तर

49

यह शुरू करने के लिए एक अच्छी धारणा है। हालांकि, reinterpret_cast<> या सी पॉइंटर कास्ट की उपस्थिति में यह अनुमान लगाया जा सकता है कि ऑप्टिमाइज़र प्रतिबंधित हो सकता है। फिर, भले ही कलाकारों के पास कोई संबंधित निर्देश नहीं है, परिणामस्वरूप कोड धीमा है।

उदाहरण के लिए, यदि आप एक सूचक को int डालते हैं, तो अनुकूलक को यह नहीं पता होगा कि वह सूचक क्या इंगित कर सकता है। नतीजतन, शायद यह मानना ​​है कि उस सूचक के माध्यम से एक लिखना किसी भी चर बदल सकता है। यह रजिस्टरों में चर भंडारण जैसे बहुत सामान्य अनुकूलन धड़कता है।

+1

मुझे नहीं लगता कि "आम तौर पर नहीं" प्रतिक्रिया के लिए आपके द्वारा इच्छित प्रतिक्रिया थी "क्या यह सच है?" –

+0

@ रोब केनेडी: एह, हाँ। Reworded। – MSalters

+1

इस उत्तर के लिए आपको बहुत बहुत धन्यवाद। शायद उस मामले में कोई व्यक्ति पंजीकरण कीवर्ड (!?) के साथ जीसीसी को संकेत दे सकता है। – fulmicoton

0

हाँ, यह सच है। कास्टिंग प्रकार जिसमें रनटाइम लागत है गतिशील_कास्ट है।

+2

'static_cast' में रनटाइम लागत भी हो सकती है; यद्यपि यह आमतौर पर केवल एक ही सूचक समायोजन होता है, या कोड को एक प्रकार से दूसरे में परिवर्तित करने के लिए कोड (जैसे 'int' को 'float' में) –

+0

'static_cast' भी उपयोगकर्ता द्वारा परिभाषित रूपांतरणों को कॉल नहीं करेगा? उन पर रनटाइम लागत असंबद्ध है। –

+0

दाएं, static_cast में प्रकार (पॉइंटर नहीं) रूपांतरण के मामले में रनटाइम लागत है। मेरा मुद्दा यह है कि गतिशील_कास्ट एकमात्र कास्ट प्रकार है जिसमें अतिरिक्त रनटाइम लागत है, अपेक्षाकृत सी कास्टिंग के लिए। –

5

यह सही है। नई चौड़ाई पर निर्देशों के प्रदर्शन के लिए प्रदर्शन में किसी भी लाभ/हानि के अलावा कोई कीमत नहीं, जो मैं जोड़ सकता हूं, केवल दुर्लभ मामलों में चिंता का विषय है। मैंने जो भी प्लेटफार्म कभी सुना है, उस पर पॉइंटर्स के बीच कास्टिंग शून्य लागत है, और कोई प्रदर्शन नहीं बदलता है।

0

आप सही हैं, लेकिन इसके बारे में सोचें: reinterpret_cast का मतलब शायद एक खराब डिज़ाइन है या आप कुछ बहुत कम स्तर कर रहे हैं।

गतिशील-कास्ट इसके बजाय आपको कुछ ख़र्च होगा, क्योंकि इसे रनटाइम पर लुकअप टेबल में देखना होगा।

+0

'dynamic_cast'' static_cast' के समान है 'reinterpret_cast' की बजाय रनटाइम जांच के साथ। आप 'reinterpreT_cast' के साथ पॉलिमॉर्फिक प्रकार नहीं डाल सकते हैं। –

+1

@ बिली ओनेल: आप बहुलक रूप से जागरूक नहीं हो सकते हैं। –

0

reinterpret_cast रनटाइम लागत नहीं लेता है .. हालांकि आपको सावधान रहना होगा, क्योंकि reinterpret_cast के प्रत्येक उपयोग को कार्यान्वित किया गया है। उदाहरण के लिए, char सरणी को int सरणी के रूप में पुनर्निर्देशित करना संभव है, लक्ष्य आर्किटेक्चर को बाधा डालने का कारण बन सकता है, क्योंकि विभिन्न प्रकारों में अलग-अलग संरेखण नियम हो सकते हैं।

पहले सही हो जाएं, फिर दक्षता के बारे में चिंता करें।

4

सी ++ में सी शैली कास्ट पहले static_cast का प्रयास करेगा और केवल एक स्थिर कास्ट नहीं किया जा सकता है, तो केवल reinterpret_cast प्रदर्शन करेगा। एक static_cast एकाधिक विरासत के मामले में सूचक के मान को बदल सकता है (या एक ठोस प्रकार के लिए इंटरफ़ेस कास्टिंग करते समय), इस ऑफसेट गणना में अतिरिक्त मशीन निर्देश शामिल हो सकता है। यह सबसे अधिक 1 मशीन निर्देश होगा तो वास्तव में बहुत छोटा है।

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