दिलचस्प पोस्ट
एक पृष्ठ वेबसाइट में jquery AJAX का उपयोग कर पृष्ठों को लोड करते समय प्रगति बार दिखाएं गीट स्थिति में फाइल्स को दिखाया गया है, भले ही सामग्रियां समान हैं I कैमरा गतिविधि रिक्त एंड्रॉइड वापस आ रही है हम एसएसएल का उपयोग कर msaccess डेटाबेस में सभी तालिकाओं को सूचीबद्ध कर सकते हैं? सीएसएस संक्रमण बनाम जेएस एनीमेशन पैकेज का प्रदर्शन एक बार प्रवेश करने के लिए SSH पर गिट को कॉन्फ़िगर करना PHP move_uploaded_file () त्रुटि? SQL सर्वर 2008 एक्सप्रेस की स्थानीय आवृत्ति से कनेक्ट करने के लिए कैसे करें रिटर्निंग 'आईल्लिस्ट' बनाम 'आईकॉल्क्न' बनाम 'कलेक्शन' कस्टम सूचना में बटन कार्रवाई को जोड़ना कैसे एक थर्मल विडियो धागा को रोकना और फिर से शुरू करना हर कॉरिएट के स्पष्ट घोषणा के बिना आरएम में सूत्र निर्दिष्ट करना यह नाम सीएनएल के अनुपालन के साथ क्यों नहीं है? उदाहरण के सी ++ समकक्ष MySQL कंडीशनल सम्मिलित करें

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

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