2012-08-14 13 views
6

सी ++ -O3 साथ संकलित में, के मामले में एक लागत है वास्तविकता के बिना विरासत करता है:सी ++ में विरासत की विरासत (वर्चुअल के बिना)?

  • निष्पादन समय
  • स्मृति

अगर जवाब हाँ है: क्यों?

उदाहरण के तौर पर: MyClass1 और MyClass2 प्रदर्शन और स्मृति के मामले में समकक्ष हैं?

enter image description here

+0

सिद्धांत में कोई प्रदर्शन अंतर नहीं होना चाहिए। अभ्यास में ... अच्छी तरह से, अपने विशेष परिदृश्यों को मापें और पता लगाएं (मुझे उच्च अनुकूलन स्तर पर कोई अंतर नहीं मिलेगा, लेकिन शायद संकलक बेस क्लास कन्स्ट्रक्टर कॉल इनलाइन करने में असफल हो सकता है, या यह ईबीओ करने में असफल हो सकता है, या ... चीजों के सभी प्रकार _could_ होता है, यह भी तेज़ हो सकता है। पता लगाने का तरीका मापना है)। –

+0

संभावित डुप्लिकेट [विरासत की लागत क्या है?] (Http://stackoverflow.com/questions/7210412/what-is-the-cost-of-inheritance) –

+0

+1: अच्छी तस्वीर। –

उत्तर

8

निष्पादन समय

क्या के

? फ़ंक्शंस को स्थिर रूप से हल किया जाता है, इसलिए फ़ंक्शन कॉल समान होती हैं। MyClass1 का निर्माता बेस क्लास के रचनाकारों को कॉल करेगा, और इसके विनाशक आधार वर्गों के विनाशकों को बुलाएंगे, इसलिए निर्माण के लिए & विनाश कुछ ओवरहेड हो सकता है। शायद। कुछ कंपाइलर कॉल को ऑप्टिमाइज़ कर सकते हैं।

स्मृति

यह वही हो जाएगा, दोनों ही एक सदस्य double है। सैद्धांतिक रूप से। मुझे लगता है कि कार्यान्वयन पर निर्भर करता है, क्योंकि यह मानक द्वारा अनिवार्य नहीं है, लेकिन आमतौर पर कोई स्मृति ओवरहेड नहीं होगा।

नोट कि, के लिए Derived परिणाम अपरिभाषित व्यवहार में एक सूचक के माध्यम से एक वस्तु MyClass1 को हटाने है, क्योंकि वहाँ कोई virtual नाशक।

नोट 2 पॉलिमॉर्फिज्म के बिना विरासत एक कोड गंध है। यह नहीं कह रहा कि यह गलत है, लेकिन ज्यादातर मामलों में संरचना बेहतर है।

+0

और चूंकि रचनाकार और विनाशक बहुत सरल हैं, इसलिए इनलाइन होना चाहिए और संकलक दोनों संस्करणों के लिए एक ही कोड उत्पन्न करेगा। –

+0

निर्माण और विनाश के बारे में: क्या कंपाइलर्स बेस में परिभाषित ओवरलोडेड ऑपरेटरों के लिए अस्थायी निर्माण/विनाश को अनुकूलित करेगा? – Vincent

+0

@ विन्सेंट - मुझे प्रश्न समझ में नहीं आता है। ओवरलोडेड ऑपरेटरों और अस्थायी लोगों के बीच कोई अंतर्निहित कनेक्शन नहीं है। –

-3

स्मृति स्थान के संदर्भ में, मुझे लगता है कि आपका MyClass1 अधिक उपभोग करता है क्योंकि इसे सभी वर्ग संरचना और संबंधों का ट्रैक रखने की आवश्यकता है। प्रदर्शन के लिए मुझे कोई उल्लेखनीय अंतर नहीं दिखता है।

+3

मुझे शक है कि यह सच है। –

+0

सेकेंडेड। उद्धरण देने के लिए, या कम से कम तर्क देने की देखभाल? – delnan

+0

कक्षा संरचना और संबंधों को संकलक द्वारा नियंत्रित किया जाता है। वर्चुअल के साथ, इनके लिए कोई रनटाइम स्पेस पेनल्टी नहीं है। –