दिलचस्प पोस्ट
मैं एक एकल एंकर टैग का उपयोग करके कई लिंक कैसे खोल सकता हूं मुझे कैसे पता चलेगा कि इनलाइन फ़ंक्शन को वास्तव में उस स्थान पर स्थान दिया जाता है जहां इसे कहा जाता है या नहीं? पुस्तकालयों के साथ मेकफाइल बनाना जावास्क्रिप्ट में लूप के साथ ईवेंट हैंडलर्स कैसे उत्पन्न करें? सेलेनियम वेबड्रिवर पृष्ठ के बाहर एक लिंक पर क्लिक नहीं कर सकते पारदर्शी पाठ पृष्ठभूमि से बाहर कट गया बैच का उपयोग करने वाले फ़ोल्डर्स और उप फ़ोल्डर्स का नाम बदलने के साथ समस्या अगर कोई भी अद्यतन अपडेट न करें तो क्या करें? अपलोड करने के लिए फ़ाइल में HTML5 कैनवास कन्वर्ट? आईओएस 8 कस्टम कीबोर्ड: ऊँचाई बदलना क्या आईफोन एसडीके के लिए ओपनसीएल टेक्स्ट ड्राइंग लाइब्रेरी है? ज: इनपुट टेक्स्ट जो स्ट्रिंग संपत्ति के लिए बाध्य है, शून्य की बजाय खाली स्ट्रिंग सबमिट कर रहा है "लैंडस्केप" अभिविन्यास मोड को बल दें Scope_Identity (), पहचान (), @@ पहचान, और Ident_Current () के बीच अंतर क्या है? AlertDialog.Builder कस्टम लेआउट और EditText के साथ; दृश्य का उपयोग नहीं कर सकते

जी ++ -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)* 

वेब के समाधान से एकत्रित समाधान "जी ++ -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 सी के अंतर्गत) हैं। ध्यान दें कि आभासी विरासत के उपयोग के कारण वे थोड़े अधिक जटिल हैं, जो प्रत्येक बच्चे वर्ग के वीटेल के लिए अतिरिक्त ऑफसेट जोड़ता है।

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