2012-10-27 19 views
9

संभव डुप्लिकेट:
Understanding the vtable entriesस्पष्टीकरण

जी का उपयोग ++ संस्करण 4.6.3, 64-बिट मशीन। मुझे पता है कि कंपाइलर आभासी कार्यों को किसी भी तरह से लागू करने के लिए स्वतंत्र है। मैं जानना चाहता हूं कि यहां क्या हुआ।

मेरी कक्षा:

#include <iostream> 
class test 
{ 
    public: 
    virtual void func(){std::cout<<"in class test";} 
}; 

int main() 
{ 
    test obj; 
    obj.func(); 
    return 0; 
} 

संकलक द्वारा उत्पन्न आभासी तालिका को देखते हुए,

Vtable for test 
test::_ZTV4test: 3u entries 
0  (int (*)(...))0 (<---- what is this?) 
8  (int (*)(...))(& _ZTI4test) 
16 (int (*)(...))test::func 

पर ऑफसेट 8 यह RTTI

पर ऑफसेट 16 यह आभासी समारोह के लिए प्रवेश है।

मेरा प्रश्न है कि ऑफसेट 0 पर न्यूल के लिए प्रविष्टि क्यों है या दूसरे शब्दों में पहली प्रविष्टि का उद्देश्य क्या है?

पीएस मैंने सोचा कि यह संरेखण से संबंधित हो सकता है, लेकिन फिर मैंने अधिक वर्चुअल फ़ंक्शंस जोड़े लेकिन आरटीटीआई एंट्री अभी भी ऑफसेट पर थी 8.

+0

मुझे लगता है कि यह विनाशक के लिए आरक्षित है (जिसे आपने नहीं जोड़ा था)। – john

+0

@ जॉन, विनाशक अभी भी एक ही आउटपुट जोड़ा। साथ ही, आवश्यक विनाशक हमेशा वी-टेबल का हिस्सा होगा? – Anon

+0

यदि आपके पास कोई वर्चुअल फ़ंक्शन है तो वर्चुअल विनाशक होना बहुत आम है। लेकिन इसकी आवश्यकता नहीं है। ओह ठीक है मेरा अनुमान गलत था। – john

उत्तर

8

मेरा मानना ​​है कि पहली प्रविष्टि या 0 पर प्रविष्टि शीर्ष सूचक के लिए ऑफसेट है।

देखें the following relevant stackoverflow question

अपने स्रोत कोड से शेष -fdump-वर्ग-पदानुक्रम के माध्यम से देख रहे हैं, सबसे कक्षाएं, (int (*)(...))0 के रूप में पहली प्रविष्टि है प्रतीत केवल कक्षाओं यह नहीं है कि के रूप में पहली प्रविष्टि है यह दूसरी के रूप में है और धाराओं के लिए सी ++ एसटीएल कक्षा पदानुक्रम दिए गए माता-पिता वर्ग के ऑफसेट के रूप में पहली प्रविष्टि है।

प्रासंगिक सवाल कुछ vtable उदाहरण के लिए एक मरे हुए लिंक दिया गया है, मुझे विश्वास है कि लिंक का एक लाइव संस्करण उपलब्ध here

vtables की संरचना का ब्यौरा एक अन्य उपयोगी संसाधन here है।

+0

बिल्कुल सही। धन्यवाद। – Anon

+0

हां। यह "ऑफसेट टू टॉप" पॉइंटर है। अन्य चीजों के अलावा, इसका उपयोग 'गतिशील_कास्ट ' को लागू करने के लिए किया जाता है। वह कलाकार सबसे व्युत्पन्न वस्तु के लिए एक सूचक देता है। पाठ्यक्रम का मानक vtables के बारे में कुछ भी नहीं कहता है, या आवश्यकतानुसार 'dynamic_cast 'फ़ंक्शन बनाने के बारे में कोई कार्यान्वयन कैसे करेगा। –

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