2013-03-04 23 views
6

Ultimamente ho letto molto e, pur coprendo l'ereditarietà (e le funzioni virtuali) continuo a inciampare nella parola chiave "in linea". Ora so che cosa è in linea nel senso normale: il compilatore può sostituire le chiamate di funzione con il codice esatto. Tuttavia, il numero di volte in cui l'ho visto menzionato per quanto riguarda l'ereditarietà, c'è qualche motivo speciale per usare in linea all'interno dell'ereditarietà? Non capisco perché continua a essere menzionato ....Ereditarietà e in linea?

Quale ruolo aggiuntivo ha una funzione in linea all'interno delle classi ereditate/derivate/funzioni virtuali?

+0

@BillyONeal Non penso che il collegamento spieghi veramente che cos'è esattamente la connessione (se ce n'è una). – user997112

+1

Ancora una volta .... questo non è un duplicato. Sto chiedendo qual è il link ..... quella domanda è se mettere in linea una funzione virtuale è inutile ... È facile per qualcuno che conosce la risposta trovare una domanda che assomiglia vagamente alla risposta, ma questo non lo fa t significa che è identico. Non conosco la risposta e la lettura che l'altra domanda non ha aiutato. – user997112

risposta

2

Sì, l'utilizzo in linea delle funzioni virtuali è una perdita di tempo. Una funzione virtuale deve essere chiamata attraverso una tabella di funzioni virtuale, che è composta da puntatori di funzione. Una funzione inline non può essere chiamata da un puntatore. Deve esistere come una funzione reale.

Ci sono alcune eccezioni. Laddove il chiamante conosce il tipo di oggetto esatto, può saltare interamente la tabella delle funzioni virtuali.

L'uso eccessivo della parola chiave virtuale può causare codice molto lento. Laddove il compilatore potrebbe essere in grado di allineare e ottimizzare tre o quattro chiamate di piccole funzioni, con le funzioni virtuali deve eseguire chiamate di funzione effettive, senza fare ipotesi sulla memoria o sullo stato di registrazione tra le chiamate.