Domanda

So che, come implementare la risoluzione delle chiamate di funzione virtuale non fa parte di C ++ Standrads né dice nulla su VPTR o V-Table, ma fammi fare questa domanda qui.

Ho sentito che V-Table è una tecnica comune utilizzata dai compilatori per implementare la risoluzione delle chiamate di funzione virtuale. La mia comprensione al riguardo è che è necessaria solo una tabella virtuale per classe, per processo.

Quello che mi chiedo è, quando viene creato il tavolo V per una classe?
È quando la classe di un determinato tipo (che necessita di un tavolo V) viene creata per la prima volta in uno spazio di processo?
Tutti gli altri oggetti creati successivamente di quel tipo nello spazio del processo, si riferiscono al ta-table che è già stato creato?
Quando verrà eliminata questa tabella V?

Mi dispiace se questo è troppo soggettivo o di discussione di domanda, ma queste domande indugia nella mia mente per un po 'e sento che va bene chiederlo qui.

È stato utile?

Soluzione

La tabella V è staticamente allocata e non viene mai eliminata, né è esplicitamente allocato. I suggerimenti all'interno di un dato oggetto specifico sono costanti.

Altri suggerimenti

Il FAQ C ++ Fornisce una spiegazione semplificata del meccanismo vtable. Dovresti dargli una lettura, anche se probabilmente dovrai passare attraverso la tua particolare documentazione del compilatore per maggiori dettagli.

Le idee più importanti dal mio punto di vista:

  • Il vtable per un tipo è statico e costruito al momento della compilazione
  • Ciascuna delle istanze di tipo contiene a Pointer a questo tavolo
  • Poiché questo puntatore è inizializzato al momento della costruzione, una funzione dei membri virtuali non dovrebbe mai essere chiamata dal costruttore

Il vTable è dati statici quindi disponibili immediatamente al carico. A proposito, di solito è in bundle nell'unità di compilazione che contiene la definizione per la prima funzione virtuale non in linea sulla classe (e che l'euristica porta al problema quando esiste una sola funzione virtuale in linea).

Credo che sia tutto definito l'implementazione, quindi è difficile dare una risposta universale a questa domanda. Credo che il vtable dovrebbe essere una sorta di membro della classe statica.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top