इस वर्ग पदानुक्रम पर विचार करें:सी ++ कंपाइलर अंतिम गति से इस गतिशील_कास्ट को अनुकूलित क्यों नहीं करते हैं?
struct Animal { virtual ~Animal(); };
struct Cat : virtual Animal {};
struct Dog final : virtual Animal {};
मेरे समझ class Dog
पर final
डाल सुनिश्चित करता है कि कि कोई भी कभी भी एक वर्ग Dog
है, जो, परिणाम है, जिसका अर्थ है कि कोई भी कभी भी एक वर्ग है कि गया-एक ऐसा बना सकते हैं से इनहेरिट बना सकते हैं Dog
और आईएस-ए Cat
एक साथ।
पर विचार इन दोनों dynamic_cast
रों:
Dog *to_final(Cat *c) {
return dynamic_cast<Dog*>(c);
}
Cat *from_final(Dog *d) {
return dynamic_cast<Cat*>(d);
}
जीसीसी, आईसीसी, और MSVC final
क्वालीफायर ध्यान न दें और __dynamic_cast
के लिए एक कॉल उत्पन्न; यह दुर्भाग्यपूर्ण है लेकिन आश्चर्य की बात नहीं है।
क्या मुझे आश्चर्य है कि बजना और Zapcc from_final
के लिए दोनों generate इष्टतम कोड ("हमेशा nullptr वापसी"), लेकिन to_final
के लिए __dynamic_cast
के लिए एक कॉल उत्पन्न है।
यह वास्तव में एक चूक अनुकूलन अवसर (एक संकलक जहां स्पष्ट रूप से किसी डाले में final
क्वालीफायर सम्मान में कुछ प्रयास डाल में) है, या कुछ सूक्ष्म कारण यह है कि मैं अभी भी नहीं कर रहा हूँ के लिए इस मामले में अनुकूलन असंभव है देख के?
मेरा अनुमान है कि इस तरह की स्थिति अक्सर अधिकतर कंपाइलरों के बारे में चिंता करने के लिए पर्याप्त नहीं होती है। दक्षता के लिए एक सामान्य वास्तविक दुनिया की आवश्यकता के जवाब में अनुकूलन लागू किए जाते हैं। – cdhowie
@cdhowie: आप सही हो सकते हैं; लेकिन मुझे क्या रोकता है यह है कि किसी ने स्पष्ट रूप से * से_फिनल 'मामले में क्लैंग अनुकूलन लिखने की परेशानी पर ध्यान दिया।'To_final' केस सममित है (विशेष रूप से कोडेजन के संदर्भ में, जहां यह दोनों प्रकार के लिए टाइपइन्फो खींच रहा है), फिर भी अज्ञात किसी ने * सममित ऑप्टिमाइज़ेशन नहीं जोड़ा है। "स्पष्ट रूप से आधा कार्यान्वित अनुकूलन" मेरे दिमाग में "बिल्कुल अनुकूलन नहीं" (सीएफ। जीसीसी, आईसीसी, एमएसवीसी) की तुलना में हमारे दिमाग में वीरडर दिखाई देता है। – Quuxplusone