सदस्य : लॉगिन |पंजीकरण |अपलोड ज्ञान
खोज
वर्चुअल विधि तालिका
1.कार्यान्वयन
2.उदाहरण
3.एकाधिक विरासत और thunks
4.मंगलाचरण
5.दक्षता [संशोधन ]
एक वर्चुअल कॉल को कम से कम एक अतिरिक्त अनुक्रमित dereference की आवश्यकता होती है, और कभी-कभी एक "फ़िक्सअप" अतिरिक्त, गैर-वर्चुअल कॉल की तुलना में, जो कि संकलित-इन पॉइंटर पर कूद है। इसलिए, वर्चुअल फ़ंक्शंस को कॉल करना गैर वर्चुअल फ़ंक्शंस को कॉल करने से स्वाभाविक रूप से धीमा है। 1 99 6 में किए गए एक प्रयोग से संकेत मिलता है कि लगभग 6-13% निष्पादन समय केवल सही कार्य को प्रेषित करने के लिए खर्च किया जाता है, हालांकि ओवरहेड 50% जितना अधिक हो सकता है। वर्चुअल फ़ंक्शंस की लागत बहुत अधिक कैश और बेहतर शाखा भविष्यवाणी के कारण आधुनिक सीपीयू आर्किटेक्चर पर इतनी अधिक नहीं हो सकती है।
इसके अलावा, ऐसे वातावरण में जहां जेआईटी संकलन उपयोग में नहीं है, वर्चुअल फ़ंक्शन कॉल आमतौर पर रेखांकित नहीं की जा सकती हैं। कुछ मामलों में संकलक के लिए devirtualization के रूप में जाना जाने वाली प्रक्रिया को निष्पादित करना संभव हो सकता है, उदाहरण के लिए, लुकअप और अप्रत्यक्ष कॉल को प्रत्येक रेखांकित शरीर के सशर्त निष्पादन के साथ प्रतिस्थापित किया जाता है, लेकिन ऐसे अनुकूलन सामान्य नहीं हैं।
इस ओवरहेड से बचने के लिए, संकलन आमतौर पर संकलन समय पर हल किए जाने पर vtables का उपयोग करने से बचें।
इस प्रकार, उपरोक्त एफ 1 पर कॉल को एक vtable लुकअप की आवश्यकता नहीं हो सकती है क्योंकि संकलक यह बताने में सक्षम हो सकता है कि डी इस बिंदु पर केवल डी को पकड़ सकता है, और डी f1 को ओवरराइड नहीं करता है। या कंपाइलर (या ऑप्टिमाइज़र) यह पता लगाने में सक्षम हो सकता है कि प्रोग्राम में कहीं भी बी 1 के उप-वर्ग नहीं हैं जो f1 को ओवरराइड करते हैं। बी 1 :: एफ 1 या बी 2 :: एफ 2 के लिए कॉल को शायद वीटेबल लुकअप की आवश्यकता नहीं होगी क्योंकि कार्यान्वयन स्पष्ट रूप से निर्दिष्ट किया गया है (हालांकि इसे अभी भी 'यह' पॉइंटर फिक्सअप की आवश्यकता है)।
6.विकल्पों के साथ तुलना
[अपलोड अधिक अंतर्वस्तु ]


सर्वाधिकार @2018 Lxjkh