2011-08-26 17 views
7

एक थोड़ी देर पहले, मैंने पाया कि बहुत ही दिलचस्प कागज dynamic_cast के लिए एक बहुत साफ प्रदर्शन अपग्रेड C++ पर: http://www2.research.att.com/~bs/fast_dynamic_casting.pdfफास्ट गतिशील कास्टिंग प्रगति

असल में, यह तेजी से उत्तराधिकार पेड़ में पारंपरिक अनुसंधान से सी ++ में जिस तरह से dynamic_cast बनाता है। जैसा कि पेपर में बताया गया है, विधि एक तेज, स्थिर समय गतिशील कास्टिंग एल्गोरिदम प्रदान करती है।

इस पत्र 2005 अब में प्रकाशित हुआ था, मैं सोच रहा हूँ अगर तकनीक कभी कहीं लागू किया गया था या अगर कोई इसे कहीं भी लागू करने की योजना है?

+1

मुझे नहीं पता कि कोई कंपाइलर इसका उपयोग करता है, लेकिन मैंने इसे पुस्तकालय आधारित आरटीटीआई समाधानों में उपयोग किया है। –

+0

चूंकि "टाइप आईडी" का "आवंटन" लिंक समय के दौरान किया जाता है (पेपर देखें), लाइब्रेरी इसे कैसे प्राप्त कर सकती है? आपके पास कोई उदाहरण है? –

+0

यह बिल्कुल वही नहीं है; आईडी को किसी अन्य विधि के माध्यम से असाइन किया गया है, लेकिन वे अभी भी एक वैध कलाकार निर्धारित करने के लिए मॉड्यूल का उपयोग करते हैं। –

उत्तर

7

मैं क्या विभिन्न compilers जीसीसी के पास का उपयोग कार्यान्वयन (जो रैखिक नहीं है) पता नहीं है। हालांकि, यह जोर देना महत्वपूर्ण है कि पेपर आवश्यक रूप से ऐसी विधि का प्रस्ताव नहीं करता है जो सभी (या यहां तक ​​कि आम) उपयोग के लिए मौजूदा कार्यान्वयन से हमेशा तेज़ होता है। यह एक सामान्य समाधान का प्रस्ताव करता है जो विरासत पदानुक्रम बढ़ने के रूप में असंवेदनशील रूप से बेहतर है।

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

इसके अलावा, यह तनाव है कि यह एक कार्यक्रम dynamic_cast का उपयोग करता है जब तक अपने काम से काम नियमों की आवश्यकता होती है लिखने के लिए कभी नहीं आवश्यक है महत्वपूर्ण है। गतिशील_कास्ट का उपयोग हमेशा एक संकेत है कि बहुरूपता का सही ढंग से उपयोग नहीं किया जा रहा है और पुन: उपयोग किया जा रहा है। यदि आपको पदानुक्रम कास्टिंग करने के आधार पर व्यवहार की आवश्यकता है, तो वर्चुअल विधि जोड़ने से साफ समाधान मिलता है। यदि आपके पास कोड अनुभाग है जो कि प्रकारों पर गतिशील_कास्ट-चेक करता है, तो कोड का वह अनुभाग कभी भी "बंद" नहीं होगा (ओपन/क्लोज़ड सिद्धांत के अर्थ में), और सिस्टम में जोड़े गए प्रत्येक नए प्रकार के लिए अपडेट होने की आवश्यकता होगी। दूसरी ओर, एक वर्चुअल प्रेषण, केवल नए प्रकारों पर जोड़ा जाता है, जिससे आप विस्तार के लिए खुले रह सकते हैं और फिर भी बेस प्रकार पर चल रहे व्यवहार को बंद कर सकते हैं।

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

भी the standards committee's review of implementations, including dynamic_cast और a well-known look at c++ in embedded environments and good use (which mentions Gibbs and Stroustrup in passing) देखें।

+0

मैं गतिशील_कास्ट पर एक प्रशंसक नहीं हूं, लेकिन ऐसी स्थितियां हैं (आमतौर पर तीसरे पक्ष के lib उपयोग या भाषा "हैक्स" के कारण) जहां इसकी आवश्यकता होती है। यह पहली बार नहीं है कि मैंने पढ़ा है कि गतिशील_कास्ट खराब डिजाइन का संकेत है और यह वही व्यवहार अन्यथा किया जा सकता था, लेकिन मुझे उस कथन का "सबूत" या कम से कम कुछ पॉइंटर्स चाहिए ... –

+0

गतिशील कास्ट एक परिवर्तनीय प्रकार और सशर्त निष्पादन के लिए एक शाखा बिंदु तक पहुंच प्रदान करता है। मानक प्रमाण से पता चलता है कि वर्चुअल प्रेषण एक ही विशेषताओं को प्रदान करता है, इसलिए कोई भी "if (dynamic_cast <...> (...))" वर्चुअल फ़ंक्शन में व्यवहार को लागू करके कॉल को आभासी प्रेषण में परिवर्तित किया जा सकता है। एक विस्तारित प्रमाण आमतौर पर इंगित करता है कि इच्छित पक्ष के साथ पदानुक्रम के लिए रैपर कक्षाएं प्रदान करके तृतीय पक्ष पुस्तकालयों का समान रूप से उपयोग किया जा सकता है। उस परिवर्तन से पता चलता है कि कार्यान्वयन की पहुंच की आवश्यकता नहीं है। – ex0du5

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