यह प्रश्न सी ++ भाषा के बारे में नहीं है (यानी मानक के बारे में नहीं) लेकिन वर्चुअल फ़ंक्शन के लिए वैकल्पिक योजनाओं को लागू करने के लिए एक कंपाइलर को कैसे कॉल करें।vptr को लागू करने के लिए वैकल्पिक योजनाएं?
आभासी कार्यों को लागू करने के लिए सामान्य योजना पॉइंटर्स की एक तालिका में सूचक का उपयोग कर रही है।
class Base {
private:
int m;
public:
virtual metha();
};
समतुल्य रूप कहते हैं में सी होगा की तरह
struct Base {
void (**vtable)();
int m;
}
पहले सदस्य कुछ आमतौर पर आदि (स्मृति जो आवेदन किया है में क्षेत्र का एक टुकड़ा आभासी कार्यों की एक सूची, के लिए सूचक है का कोई नियंत्रण नहीं)। और ज्यादातर मामलों में सदस्यों पर विचार करने से पहले सूचक के आकार की लागत होती है। इसलिए 32 बिट एड्रेसिंग स्कीम में लगभग 4 बाइट्स इत्यादि। यदि आपने अपने अनुप्रयोगों में 40k पॉलीमोर्फिक ऑब्जेक्ट्स की एक सूची बनाई है, तो यह लगभग 40k x है किसी भी सदस्य चर, आदि से पहले 4 बाइट = 160k बाइट्स। मुझे यह भी पता है कि यह सी ++ संकलन के बीच सबसे तेज़ और सामान्य कार्यान्वयन होता है।
मुझे पता है कि यह एकाधिक विरासत से जटिल है (विशेष रूप से उनमें वर्चुअल कक्षाओं, यानी हीरे संरचना, आदि के साथ)।
भी ऐसा ही करने का एक वैकल्पिक तरीका vptrs (नीचे के रूप में सी में समतुल्य रूप)
struct Base {
char classid; // the classid here is an index into an array of vtables
int m;
}
की एक तालिका में एक सूचकांक आईडी के रूप में पहली चर के लिए एक आवेदन पत्र में कक्षाओं की कुल संख्या है, तो है 255 से कम (सभी संभावित टेम्पलेट इंस्टॉलेशन, इत्यादि सहित), फिर एक चार्ट इंडेक्स को पकड़ने के लिए पर्याप्त है जिससे आवेदन में सभी पॉलिमॉर्फिक वर्गों के आकार को कम किया जा सके (मैं संरेखण के मुद्दों को छोड़ रहा हूं, आदि)।
मेरे प्रश्न है, क्या ऐसा करने के लिए जीएनयू सी ++, एलएलवीएम, या किसी अन्य कंपाइलर में कोई स्विच है ?? या polymorphic वस्तुओं के आकार को कम करें?
संपादित करें: मैं संरेखण के मुद्दों के बारे में समझता हूं। इसके अलावा, एक और बिंदु, अगर यह 64 बिट सिस्टम (64 बिट वीपीटीआर मानते हुए) पर था, तो प्रत्येक पॉलीमोर्फिक ऑब्जेक्ट सदस्यों के पास 8 बाइट्स की लागत होती है, तो वीपीटीआर की लागत स्मृति का 50% है। यह ज्यादातर द्रव्यमान में बनाए गए छोटे बहुलक से संबंधित है, इसलिए मैं सोच रहा हूं कि यदि यह योजना कम से कम विशिष्ट वर्चुअल ऑब्जेक्ट्स के लिए संभव है तो पूरे एप्लिकेशन को नहीं।
सदस्य मीटर शायद अभी भी एक DWORD सीमा पर गठबंधन किया जाएगा, ताकि आप कुछ भी नहीं हासिल होगा। – Henrik
उस योजना के साथ मुद्दा शायद संरेखण में से एक होगा। यहां आपके दूसरे उदाहरण में स्ट्रक्चर बेस (आमतौर पर) 5 बाइट्स नहीं लेगा, जिससे आप प्रति ऑब्जेक्ट 3 बाइट्स बचा सकते हैं। एम को किसी भी तरह से 4 बाइट सीमा पर गठबंधन किया जाएगा, इसलिए आपके पास बर्बाद अंतरिक्ष के 3 बाइट होंगे –
मुझे लगता है कि आभासी तालिका कार्यान्वयन की यह विधि लगभग सार्वभौमिक है। मैं निश्चित रूप से कभी भी किसी अन्य विधि, या जीसीसी या विजुअल सी ++ पर किसी भी विकल्प पर नहीं आया हूं जो इसे नियंत्रित करेगा कि इसे कैसे कार्यान्वित किया गया था। एक दिलचस्प प्रश्न –