सी ++ कोड रन-टाइम प्रकार की जानकारी के साथ संकलित किया जा सकता है, जो dynamic_cast
अक्षम करता है। लेकिन, वर्चुअल (पॉलिमॉर्फिक) विधियों को अभी भी लक्ष्य के रन-टाइम प्रकार के आधार पर प्रेषित करने की आवश्यकता है। क्या यह इंगित नहीं करता कि टाइप की जानकारी वैसे भी मौजूद है, और dynamic_cast
हमेशा काम करने में सक्षम होना चाहिए?कोई आरटीटीआई लेकिन अभी भी आभासी तरीकों
उत्तर
आरटीटीआई हत्या dynamic_cast
और typeid
अक्षम करने पर वर्चुअल फ़ंक्शंस पर कोई प्रभाव नहीं पड़ता है। आभासी कार्यों को कक्षाओं के "vtable" के माध्यम से प्रेषित किया जाता है जिनमें कोई वर्चुअल फ़ंक्शन होता है; यदि आप एक vtable होने से बचना चाहते हैं तो आप केवल वर्चुअल फ़ंक्शन नहीं कर सकते हैं।
जंगलों में सी ++ कोड के बहुत सारे dynamic_cast
बिना काम कर सकते हैं और लगभग यह सभी typeid
बिना काम कर सकते हैं, लेकिन अपेक्षाकृत कुछ C++ अनुप्रयोग या एक से अधिक बात करने के लिए किसी भी आभासी कार्यों के बिना जीवित हैं (, कार्यों वे बनने आभासी होने की उम्मीद गैर आभासी)।
वर्चुअल टेबल (vtable) सभी वर्चुअल फ़ंक्शंस के लिए प्रति-प्रकार लुकअप तालिका में प्रति-आवृत्ति सूचक है। आप केवल जो भी उपयोग करते हैं उसके लिए भुगतान करते हैं (बजेर्न इस दर्शन को पसंद करते हैं, और शुरुआत में आरटीटीआई का विरोध करते हैं)। दूसरी तरफ पूर्ण आरटीटीआई के साथ, आप अपने पुस्तकालयों और निष्पादन योग्यों के साथ समाप्त होते हैं जिनमें बहुत से विस्तृत तार होते हैं और अन्य प्रकार के नाम का वर्णन करने के लिए बेक की गई अन्य जानकारी और शायद अन्य चीजों के बीच पदानुक्रमिक संबंधों की तरह।
मैंने उत्पादन प्रणालियों को देखा है जहां आरटीटीआई को अक्षम करने से एक्जिक्यूटिव के आकार को 50% तक कम कर दिया गया है। इनमें से अधिकांश बड़े स्ट्रिंग नामों के कारण थे जो कुछ सी ++ प्रोग्रामों में समाप्त होते हैं जो टेम्पलेट्स का भारी उपयोग करते हैं।
ठीक है, इसलिए 'dynamic_cast' को और जानकारी चाहिए। लेकिन ऐसा लगता है कि 'टाइपिड' अभी भी काम कर सकता है, कम से कम उन प्रकारों के लिए जिनके पास vtable है। क्या Vtable पॉइंटर को मैन्युअल रूप से C++ कोड से एक्सेस किया जा सकता है? –
'टाइपिड' काम नहीं कर सकता क्योंकि इसका मुख्य उद्देश्य प्रत्येक प्रकार के लिए एक नाम प्रदान करना है, और उन नामों (वास्तविक शून्य-समाप्त तार) आरटीटीआई के बिना ऑब्जेक्ट फ़ाइलों में उत्सर्जित नहीं होते हैं। और नहीं, V ++ में पोर्टेबल तरीके से vtable मैन्युअल रूप से एक्सेस नहीं किया जा सकता है। प्लेटफॉर्म-विशिष्ट तरीके हो सकते हैं, लेकिन यहां तक कि दुर्लभ आईएमओ भी है। –
ओह, मुझे स्कूज़ करें। :) मैंने देखा, बिना जांच के, कि 'टाइपिड' किसी प्रकार का तिरछी पूर्णांक/सूचक देता है। यह समझ में आता है कि यह काम नहीं करता है अगर यह एक स्ट्रिंग है (संपादित करें: वास्तव में 'वर्ग प्रकार_इनोफा')। –
- 1. सी ++ "आभासी कार्यों, लेकिन कोई आभासी विनाशकर्ता"
- 2. अधिभावी गैर आभासी तरीकों
- 3. आभासी और अमूर्त तरीकों
- 4. सी में कोई कार्यान्वयन ++, लेकिन अभी भी यह
- 5. शरीर के बिना आभासी तरीकों
- 6. पोस्टग्रेएसक्यूएल: ड्रॉप डेटाबेस लेकिन डीबी अभी भी
- 7. समर्थन रूपांतरण, लेकिन अभी भी ToString
- 8. अद्यतन गिट लेकिन अभी भी पुराना संस्करण
- 9. वरीयता को अक्षम करें, लेकिन अभी भी
- 10. व्युत्पन्न सार कक्षा में शुद्ध आभासी तरीकों
- 11. इंटरफेस, सार, या सिर्फ आभासी तरीकों?
- 12. आरटीटीआई
- 13. आरटीटीआई
- 14. राइनो - वर्गों मजाक और आभासी तरीकों
- 15. प्रदर्शन करता है: कोई नहीं अभी भी
- 16. गैर आभासी तरीकों का नकल कैसे करें?
- 17. क्या कोई अभी भी क्लाइंट सर्वर आर्किटेक्चर
- 18. अधिभावी आभासी तरीकों जब एक वर्ग
- 19. कोई भी अभी भी xlib का उपयोग कर प्रोग्राम
- 20. अलगाव लेवल का उपयोग करना। स्नैपशॉट लेकिन डीबी अभी भी
- 21. एपीसी सक्षम लेकिन अपाचे अभी भी फ़ाइलें खोल रहा है?
- 22. क्लिक पर AJAX भेजें, लेकिन अभी भी href
- 23. एक WPF बटन अक्षम करें, लेकिन अभी भी क्लिक ईवेंट
- 24. यूआरएल ब्राउज़र के साथ सुलभ है लेकिन अभी भी URLNonnection
- 25. यह पैटर्न संपूर्ण लगता है, लेकिन मैं अभी भी चेतावनी
- 26. heightForRowAtIndexPath = 0 लेकिन यह अभी भी अपनी पंक्ति
- 27. मैं आरटीटीआई
- 28. कोई भी अच्छा सबवर्जन 1.5 आभासी उपकरण सिफारिशें?
- 29. मेरा ऐप अभी भी
- 30. WPF आवेदन अभी भी
मेरा अनुमान यह होगा कि vtable अभी भी मौजूद है लेकिन इसमें कोई भी प्रकार की जानकारी नहीं है (केवल फ़ंक्शन पॉइंटर्स) आभासी फ़ंक्शन अभी भी काम करेंगे। –
http://stackoverflow.com/questions/4486609/when-can-compiling-c-without-rtti-cause-problems ... के संभावित डुप्लिकेट ...? –
काम करने के लिए गतिशील_कास्ट बनाने के लिए (एकाधिक विरासत वाले जटिल मामलों में) आपको वर्चुअल फ़ंक्शन टेबल – marom