दिलचस्प पोस्ट
एंड्रॉइड में विशाल छवियां प्रदर्शित करें एंड्रॉइड पर मीडियास्टोर का उपयोग करते हुए मैं कैमरे से डिस्क पर डेटा कैसे बचा सकता हूं? कैसे मेवेन के माध्यम से JSF पुस्तकालयों को ठीक से स्थापित और कॉन्फ़िगर करें? क्या एक सरल एल्गोरिथ्म है जो यह निर्धारित कर सकता है कि एक्स प्रधान है, और केवल एक नर्तक प्रोग्रामर को भ्रमित न करें? मुद्रा परिवर्तित करने के लिए एपीआई की आवश्यकता कॉलम की गणना किसी अन्य कॉलम से की गई है? क्रोम डेवलपर उपकरण के साथ आइफ्रेम डिबग करना सी ++ पंक्ति से फ़ाइल लाइन पढ़ें और फिर प्रत्येक पंक्ति को सीमांकक का उपयोग करके विभाजित करें कैसे दृश्य स्टूडियो को आउटपुट निर्देशिका में एक DLL फ़ाइल की प्रतिलिपि बनाने के लिए? सेलेनियम 2.0 बी 3 IE वेबड्राइवर, फ़ायरिंग नहीं पर क्लिक करें सी # /। नेट ऑब्जेक्ट का उपयोग कितना मेमोरी करता है? पेज लोड पर कोणीय नियंत्रक फ़ंक्शन कैसे निष्पादित करें? आईओएस एप सबमिशन: 64-बिट समर्थन लापता मैं सीएसएस के साथ एचटीएमएल 5 फॉर्म सत्यापन त्रुटि संदेश कैसे शैली करता हूं? कैसे जावास्क्रिप्ट के साथ एक नोड में किसी पाठ का भाग लपेटें

जी ++ -fdump-class-hierarchy के उत्पादन में पहली (int (*) (…)) 0 vtable प्रविष्टि क्या है?

इस कोड के लिए:

class B1{ public: virtual void f1() {} }; class D : public B1 { public: void f1() {} }; int main () { B1 *b1 = new B1(); D *d = new D(); return 0; } 

संकलन के बाद, मैं g++ -fdump-class-hierarchy साथ मिल सकता है:

 Vtable for B1 B1::_ZTV2B1: 3u entries 0 (int (*)(...))0 8 (int (*)(...))(& _ZTI2B1) 16 B1::f1 Vtable for D D::_ZTV1D: 3u entries 0 (int (*)(...))0 8 (int (*)(...))(& _ZTI1D) 16 D::f1 

मैं यह समझने में विफल रहा हूं कि प्रविष्टियों (int ( ) (…)) 0 * के अनुरूप हैं बेशक इसका मतलब कुछ ऐसा है, यह एक ऐसा समारोह है जो एक इंटर्न देता है और असीमित संख्या में बहस लेता है, मैं आगे कुछ नहीं समझता। यह फ़ंक्शन पॉइंटर किस प्रकार के अनुरूप है? और आप यह कैसे जानते हैं? मेरा एक 64 बिट मशीन है I

दूसरे फ़ंक्शन पॉइंटर के अंत में जुड़े पते हैं ?? यह किसके अनुरूप है?

संपादित करें

कंपाइलर, मैं उपयोग जी ++ है:

 g++ -v Using built-in specs. Target: x86_64-suse-linux Configured with: ../configure --prefix=/usr --infodir=/usr/share/info --mandir=/usr/share/man --libdir=/usr/lib64 --libexecdir=/usr/lib64 --enable-languages=c,c++,objc,fortran,obj-c++,java,ada --enable-checking=release --with-gxx-include-dir=/usr/include/c++/4.4 --enable-ssp --disable-libssp --with-bugurl=http://bugs.opensuse.org/ --with-pkgversion='SUSE Linux' --disable-libgcj --disable-libmudflap --with-slibdir=/lib64 --with-system-zlib --enable-__cxa_atexit --enable-libstdcxx-allocator=new --disable-libstdcxx-pch --enable-version-specific-runtime-libs --program-suffix=-4.4 --enable-linux-futex --without-system-libunwind --with-arch-32=i586 --with-tune=generic --build=x86_64-suse-linux Thread model: posix *gcc version 4.4.1 [gcc-4_4-branch revision 150839] (SUSE Linux)* 

Solutions Collecting From Web of "जी ++ -fdump-class-hierarchy के उत्पादन में पहली (int (*) (…)) 0 vtable प्रविष्टि क्या है?"

ये ऑफसेट-टू-टॉप (बहु वारिस के लिए आवश्यक) और टाइपइंफो (आरटीडीआई) पॉइंटर्स हैं।

इटेनियम एबीआई (आप इटेनियम कंपाइलर का प्रयोग नहीं कर रहे हैं, लेकिन इसका उनका विवरण वाकई अच्छा है) :

शीर्ष पर ऑफसेट ऑब्जेक्ट के ऊपरी हिस्से में वर्चुअल टेबल पॉइंटर के ऑब्जेक्ट के अंदर ऑब्जेक्ट को धारण करता है जो इस वर्चुअल टेबल को संबोधित करता है, जैसे कि ptrdiff_t। यह हमेशा मौजूद होता है ओफ़्सेट ऑब्जेक्ट के ऊपर एक वर्चुअल टेबल पॉइंटर के साथ किसी भी बेस सबबैज से खोजने का तरीका प्रदान करता है। यह विशेष रूप से गतिशील_कास्ट के लिए आवश्यक है
(एक पूर्ण आभासी आभासी तालिका में, और इसलिए इसकी सभी प्राथमिक आधार आभासी तालिकाओं में, ऑफसेट का मान शून्य होगा। […])

टाइपइन्फो पॉइंटर आरटीटीआई के लिए उपयोग किए जाने वाले टाइपइन्फो ऑब्जेक्ट को इंगित करता है यह हमेशा मौजूद होता है किसी दिए गए वर्ग के प्रत्येक आभासी तालिकाओं में सभी प्रविष्टियों को उसी प्रकार इंगॉन्फ़ ऑब्जेक्ट पर इंगित करना चाहिए। टाइपइन्फो समानता का सही क्रियान्वयन, संकेतक (सीधे या अप्रत्यक्ष रूप से) अपूर्ण प्रकारों को छोड़कर, सूचक समानता को जांचना है। टाइपइन्फो सूचक पॉलीमोर्फ़िक वर्गों के लिए एक वैध सूचक है, अर्थात वे वर्चुअल फ़ंक्शन के साथ, और गैर-बहुविध वर्गों के लिए शून्य है।


अधिक विवरण में ऑफ़सेट-टू-टॉप (अनुरोध के अनुसार)

मान लीजिए कि आपके पास एक व्युत्पन्न वर्ग D जो बेस क्लास से प्राप्त होता है, B1 । क्या होता है जब आप B1 टाइप करने के लिए D इंस्टेंस डालना चाहते हैं? चूंकि कार्य जो B1 ऑब्जेक्ट लेते हैं, वह D बारे में कुछ भी नहीं जानता, D वीटेल का हिस्सा भी एक वैध B1 वीटेल होना चाहिए। यह बहुत आसान है – बस D vtable की शुरुआत B1 वीटेल की तरह करें, और उसके बाद हमें जो भी अतिरिक्त प्रविष्टियों की ज़रूरत है उन्हें जोड़ दें। B1 अपेक्षा कार्य करना खुशी होगी, क्योंकि वे B1 लिए जो उम्मीद कर रहे हैं उससे अधिक का उपयोग नहीं किया जाएगा।

हालांकि, अगर D अब भी B2 से निकला है तो क्या होगा? D vtable के सूचक एक मान्य B1 vtable और एक वैध B2 vtable दोनों नहीं हो सकता! कंपाइलर यह हमारे संयुक्त D/B1 वीबले के अंत में एक अलग B2 वीटेल सम्मिलित करके इसे हल करता है, और जब हम D से B2 पर डालने की कोशिश करते हैं, तो मैन्युअल रूप से वीटेबल-पॉइंटर को समायोजित कर लेता है।

हालांकि, यह एक नई समस्या की ओर जाता है – क्या होता है जब हम B2 से D को वापस डालने की कोशिश करते हैं? कंपाइलर केवल वेट-पॉइंटर को पीछे की ओर उसी तरह समायोजित नहीं कर सकता जिसने इसे पहले संकेतक को समायोजित कर दिया था, क्योंकि यह वास्तव में सुनिश्चित नहीं है कि B2 ऑब्जेक्ट जिसे हम दे रहे हैं वह D प्रकार की है! विशेष रूप से, dynamic_cast<D>() को यह बताने में सक्षम होना चाहिए कि क्या हमारा उद्देश्य या प्रकार D । इसके लिए, ऑब्जेक्ट के आरटीटीआई तक पहुंचने की आवश्यकता है, और इसके लिए, यह जानना जरूरी है कि मूल ऑब्जेक्ट की वीटेल की शुरुआत कहां है यह ऑफ़सेट-टू-टॉप वैल्यू का उद्देश्य है- यह हमें मूल ऑब्जेक्ट के वीटेल की शुरुआत के लिए ऑफसेट देता है, हम अपने ऑब्जेक्ट की आरटीटीआई प्राप्त करते हैं, और सी ++ की तात्पर्य ईश्वर हमारे फसलों को दूसरे सीजन के लिए विकसित करने की अनुमति देता है।

इस पेज में कुछ अच्छे उदाहरण हैं जो कि vtable लेआउट्स ( तालिका 1 सी के अंतर्गत) हैं। ध्यान दें कि आभासी विरासत के उपयोग के कारण वे थोड़े अधिक जटिल हैं, जो प्रत्येक बच्चे वर्ग के वीटेल के लिए अतिरिक्त ऑफसेट जोड़ता है।

हो सकता है कि पहली प्रविष्टि एक वर्चुअल डिस्ट्रक्टर के लिए है और दूसरा आरटीटीआई समर्थन के लिए है? लेकिन यह केवल एक अनुमान है