2015-12-18 9 views
13

सी ++ कोड रन-टाइम प्रकार की जानकारी के साथ संकलित किया जा सकता है, जो dynamic_cast अक्षम करता है। लेकिन, वर्चुअल (पॉलिमॉर्फिक) विधियों को अभी भी लक्ष्य के रन-टाइम प्रकार के आधार पर प्रेषित करने की आवश्यकता है। क्या यह इंगित नहीं करता कि टाइप की जानकारी वैसे भी मौजूद है, और dynamic_cast हमेशा काम करने में सक्षम होना चाहिए?कोई आरटीटीआई लेकिन अभी भी आभासी तरीकों

+1

मेरा अनुमान यह होगा कि vtable अभी भी मौजूद है लेकिन इसमें कोई भी प्रकार की जानकारी नहीं है (केवल फ़ंक्शन पॉइंटर्स) आभासी फ़ंक्शन अभी भी काम करेंगे। –

+1

http://stackoverflow.com/questions/4486609/when-can-compiling-c-without-rtti-cause-problems ... के संभावित डुप्लिकेट ...? –

+0

काम करने के लिए गतिशील_कास्ट बनाने के लिए (एकाधिक विरासत वाले जटिल मामलों में) आपको वर्चुअल फ़ंक्शन टेबल – marom

उत्तर

13

आरटीटीआई हत्या dynamic_cast और typeid अक्षम करने पर वर्चुअल फ़ंक्शंस पर कोई प्रभाव नहीं पड़ता है। आभासी कार्यों को कक्षाओं के "vtable" के माध्यम से प्रेषित किया जाता है जिनमें कोई वर्चुअल फ़ंक्शन होता है; यदि आप एक vtable होने से बचना चाहते हैं तो आप केवल वर्चुअल फ़ंक्शन नहीं कर सकते हैं।

जंगलों में सी ++ कोड के बहुत सारे dynamic_cast बिना काम कर सकते हैं और लगभग यह सभी typeid बिना काम कर सकते हैं, लेकिन अपेक्षाकृत कुछ C++ अनुप्रयोग या एक से अधिक बात करने के लिए किसी भी आभासी कार्यों के बिना जीवित हैं (, कार्यों वे बनने आभासी होने की उम्मीद गैर आभासी)।

वर्चुअल टेबल (vtable) सभी वर्चुअल फ़ंक्शंस के लिए प्रति-प्रकार लुकअप तालिका में प्रति-आवृत्ति सूचक है। आप केवल जो भी उपयोग करते हैं उसके लिए भुगतान करते हैं (बजेर्न इस दर्शन को पसंद करते हैं, और शुरुआत में आरटीटीआई का विरोध करते हैं)। दूसरी तरफ पूर्ण आरटीटीआई के साथ, आप अपने पुस्तकालयों और निष्पादन योग्यों के साथ समाप्त होते हैं जिनमें बहुत से विस्तृत तार होते हैं और अन्य प्रकार के नाम का वर्णन करने के लिए बेक की गई अन्य जानकारी और शायद अन्य चीजों के बीच पदानुक्रमिक संबंधों की तरह।

मैंने उत्पादन प्रणालियों को देखा है जहां आरटीटीआई को अक्षम करने से एक्जिक्यूटिव के आकार को 50% तक कम कर दिया गया है। इनमें से अधिकांश बड़े स्ट्रिंग नामों के कारण थे जो कुछ सी ++ प्रोग्रामों में समाप्त होते हैं जो टेम्पलेट्स का भारी उपयोग करते हैं।

+0

ठीक है, इसलिए 'dynamic_cast' को और जानकारी चाहिए। लेकिन ऐसा लगता है कि 'टाइपिड' अभी भी काम कर सकता है, कम से कम उन प्रकारों के लिए जिनके पास vtable है। क्या Vtable पॉइंटर को मैन्युअल रूप से C++ कोड से एक्सेस किया जा सकता है? –

+0

'टाइपिड' काम नहीं कर सकता क्योंकि इसका मुख्य उद्देश्य प्रत्येक प्रकार के लिए एक नाम प्रदान करना है, और उन नामों (वास्तविक शून्य-समाप्त तार) आरटीटीआई के बिना ऑब्जेक्ट फ़ाइलों में उत्सर्जित नहीं होते हैं। और नहीं, V ++ में पोर्टेबल तरीके से vtable मैन्युअल रूप से एक्सेस नहीं किया जा सकता है। प्लेटफॉर्म-विशिष्ट तरीके हो सकते हैं, लेकिन यहां तक ​​कि दुर्लभ आईएमओ भी है। –

+0

ओह, मुझे स्कूज़ करें। :) मैंने देखा, बिना जांच के, कि 'टाइपिड' किसी प्रकार का तिरछी पूर्णांक/सूचक देता है। यह समझ में आता है कि यह काम नहीं करता है अगर यह एक स्ट्रिंग है (संपादित करें: वास्तव में 'वर्ग प्रकार_इनोफा')। –

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