2012-10-27 14 views
9

Eventuali duplicati:
Understanding the vtable entriesSpiegazione della tabella virtuale

Utilizzando g ++ versione 4.6.3, computer a 64 bit. So che il compilatore è libero di implementare le funzioni virtuali nel modo desiderato. Voglio sapere cosa è successo qui.

La mia classe:

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

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

Guardando tavolo virtuale generato dal compilatore,

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

all'offset 8 è RTTI

all'offset 16 è entrata per la funzione virtuale.

La mia domanda è perché c'è una voce per NULL a offset 0 o in altre parole qual è lo scopo della prima immissione?

P.S. Ho pensato che questo potesse essere correlato all'allineamento, ma poi ho aggiunto più funzioni virtuali ma la voce RTTI era ancora in offset 8.

+0

Suppongo che sia riservato per il distruttore (che non è stato aggiunto). – john

+0

@John, il distruttore aggiunto ha ancora lo stesso output. Inoltre, è necessario che il distruttore faccia sempre parte di v-table? – Anon

+0

È molto comune disporre di un distruttore virtuale se si dispone di funzioni virtuali. Ma non è richiesto. Oh bene, la mia ipotesi era sbagliata. – john

risposta

8

Credo che la prima voce o la voce a 0 sia l'offset del puntatore superiore.

Vedi the following relevant stackoverflow question

Guardando attraverso il resto -fdump gerarchia di classi dal codice sorgente, la maggior parte delle classi di sembrare la hanno la prima voce come (int (*)(...))0, le uniche classi che non hanno come prima voce hanno è il secondo ed ha la prima voce come offset rispetto alla classe genitore data la gerarchia di classi C++ STL per gli stream.

Nella relativa domanda viene assegnato un link morto ad alcuni esempi vtable, credo che una versione live di quel collegamento è disponibile here

Un'altra risorsa utile in dettaglio la struttura del VTables è here.

+0

Perfetto. Grazie. – Anon

+0

Sì. È il puntatore "offset to top". Tra le altre cose, questo è usato per implementare 'dynamic_cast '. Quel cast dà un puntatore all'oggetto più derivato. Lo standard ovviamente non dice nulla riguardo a vtables, o su come sarà implementata l'implementazione della funzione 'dynamic_cast ' come richiesto. –

Problemi correlati