संभव डुप्लिकेट:
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.
मुझे लगता है कि यह विनाशक के लिए आरक्षित है (जिसे आपने नहीं जोड़ा था)। – john
@ जॉन, विनाशक अभी भी एक ही आउटपुट जोड़ा। साथ ही, आवश्यक विनाशक हमेशा वी-टेबल का हिस्सा होगा? – Anon
यदि आपके पास कोई वर्चुअल फ़ंक्शन है तो वर्चुअल विनाशक होना बहुत आम है। लेकिन इसकी आवश्यकता नहीं है। ओह ठीक है मेरा अनुमान गलत था। – john