Come ho capito, l'ubicazione della tabella del puntatore di funzione virtual
in un oggetto dipende dal compilatore.
Ci sono dei pro/contro nel posizionare questo puntatore all'inizio dell'oggetto vs alla fine o viceversa?posizione del puntatore della tabella di funzione virtuale nell'oggetto
risposta
La semplice esistenza di una tabella di funzione virtuale dipende dal compilatore (ma tutti i compilatori lo fanno) e la posizione non è obbligatoria neanche ... In tutti i compilatori di cui Conosco i dettagli, il vptr è memorizzato all'inizio dell'oggetto. Il motivo è che fornisce una posizione uniforme. Si consideri una gerarchia di classi:
struct base {
T data;
virtual void f();
};
struct derived : base {
T1 data;
virtual void g();
};
Se il vptr è stato memorizzato alla fine dell'oggetto, allora sarebbe dopo sizeof(T)
byte per un oggetto di tipo completo base
. Ora quando si ha un oggetto di tipo completo derived
, il layout dell'oggetto secondario base
deve essere compatibile con il layout di un oggetto base
completo, pertanto lo deve essere ancora sizeof(T)
byte all'interno dell'oggetto, che sarebbe da qualche parte nel al centro dell'oggetto derived
(sizeof(T)
dall'inizio, sizeof(T1)
prima della fine). Quindi non sarebbe più allo fine dell'oggetto.
Inoltre, dato un puntatore this
, una chiamata virtuale richiede un'indiretto attraverso il vtable, che sostanzialmente è la dereferenziazione vptr
, aggiungendo un offset e saltare alla posizione di memoria memorizzate. Se il vptr
è stato memorizzato alla fine dell'oggetto, per ogni chiamata virtuale ci sarà un'ulteriore aggiunta a this
prima di delegare il vptr
.
In teoria si potrebbe avere sia vptr sia alla fine del subobject della classe base sia dell'oggetto completo. Avrebbe senso: avere il vptr 'Derivato' per le funzioni virtuali che non appaiono in' Base'. Ma l'overhead per oggetto non è così carino. – MSalters
Grande spiegazione !!! –
Sì, dipende completamente dall'implementazione.
Per una gerarchia di ereditarietà semplice si trova all'inizio dell'oggetto ma per una gerarchia complessa non lo sarà.
In ogni caso, qualsiasi codice sorgente che scrivi non dovrebbe fare affidamento su dove si trova, infatti qualsiasi codice che scrivi non dovrebbe fare affidamento sull'esistenza di una tabella virtuale o di un puntatore di una tabella virtuale.
Lo standard C++ non richiede che il dispatch virtuale venga implementato tramite la tabella virtuale e il puntatore, un'implementazione è libera di implementarlo utilizzando un altro metodo di implementazione, tuttavia tutti i compilatori mainstream implementano questo meccanismo tramite il puntatore del tavolo il punto importante da notare è che può differire nell'implementazione esatta di dove si trova il puntatore, ecc.
- 1. Spiegazione della tabella virtuale
- 2. Chiamare la definizione della classe base della funzione membro virtuale con il puntatore di funzione
- 3. Implementazione della funzione membro della base di chiamata tramite il puntatore della funzione membro alla funzione virtuale
- 4. Comportamento della funzione virtuale in C++
- 5. ios UIPanGestureRecognizer posizione del puntatore
- 6. C++ Implementazione della funzione virtuale?
- 7. Override esplicito della funzione virtuale
- 8. ottiene la posizione del puntatore del terminale
- 9. Un puntatore a una funzione virtuale viene ancora richiamato virtualmente?
- 10. Indirizzo di stampa della funzione membro virtuale
- 11. Perché abbiamo bisogno della tabella virtuale?
- 12. funzione virtuale dichiarata non virtuale in una classe derivata
- 13. Come chiamare funzione virtuale della classe derivata tramite puntatore alla classe base
- 14. Tabella virtuale per la classe derivata che non ha alcuna funzione virtuale eccetto la classe genitore una funzione virtuale
- 15. Funzione postgresql della tabella temporanea
- 16. Puntatore funzione di avvolgimento
- 17. Puntatore funzione al membro della classe statico?
- 18. Come passare l'argomento della funzione una funzione del puntatore usando la funzione wrapper?
- 19. funzione virtuale in Javascript
- 20. Funzione Puntatore alla funzione membro della classe template? (C++)
- 21. Vagrant - impostare la posizione del disco rigido virtuale per VirtualBox
- 22. Come trovare la posizione corrente della riga del puntatore del file in C?
- 23. "decadimento" funzione-funzione-puntatore
- 24. Python funzione di puntatore
- 25. Tabella normale vs tabella virtuale SQLite DB
- 26. Dichiarazione ricorsiva del puntatore funzione in C
- 27. Passaggio del puntatore alla funzione in Dlang
- 28. Pin un puntatore di funzione
- 29. Variabile membro membro della classe derivata accesso in funzione virtuale
- 30. L'impatto del virtuale sull'utilizzo del modello membro della classe
possibile duplicato di [Recupero di vptr (puntatore alla tabella virtuale aka VTABLE) dall'utilità Objdump?] (Http://stackoverflow.com/questions/10549311/retrieving-vptrpointer-to-virtual-table-aka-vtablefrom- the-objdump-utility) – iammilind