Differenze tra ramificazioni e metodi virtuali

-1

Stavo cercando di trovare più informazioni sull'argomento, ma ho potuto trovare solo questo: In C ++ perché e in che modo le funzioni virtuali sono più lente?

La risposta dice che la chiamata virtuale "Ottieni [s] l'indirizzo corretto della funzione dal vtable in un registro (l'indice in cui è archiviato l'indirizzo corretto della funzione è deciso al momento della compilazione).".

Ma come fa a sapere qual è la funzione corretta (indirizzo) in primo luogo? Non deve controllare quale tipo ha l'oggetto sottostante per farlo, quindi è simile a un'istruzione switch di ramo?

    
posta ZeroZ30o 23.10.2018 - 15:46
fonte

1 risposta

3

Il compilatore C ++ crea il vtable per ogni classe. Se le classi A e B sono entrambe sottoclassi di classe Base , e sovrascrivono i metodi in base, quindi vtable per A e vtable per B sono costruiti con i puntatori ai rispettivi metodi sovrascritti.

Per il codice in cui viene chiamato il metodo virtuale, la voce nel vtable per l'oggetto viene caricata con l'indirizzo del metodo corretto per la sottoclasse.

Supponendo che la classe Base abbia quattro metodi virtuali, m1 , m2 , m3 e m4 , il vtable avrà 4 voci e m3 sarà la terza voce nella tabella. La sottoclasse A sovrascrive i metodi m1 e m4 , mentre la sottoclasse B sovrascrive tutti. Il vtable per A avrà quattro voci, con i puntatori a A::m1 , Base::m2 , Base:m3 e A::m4 , mentre B avrà anche quattro voci, con i puntatori a B::m1 , B::m2 , B::m3 e B::m4 . Nel sito di chiamata in cui viene richiamato m3 , la terza voce vtable viene caricata con il puntatore del metodo corretto poiché il compilatore ha costruito le tabelle in questo modo.

(Naturalmente, c'è molto di più per la costruzione e il layout vtable di quello che ho presentato, quindi il tuo chilometraggio può variare.)

    
risposta data 23.10.2018 - 16:12
fonte

Leggi altre domande sui tag