Avere almeno un metodo virtuale in una classe C ++ (o una qualsiasi delle sue classi padre) significa che la classe avrà una tabella virtuale e ogni istanza avrà un puntatore virtuale.
Quindi il costo della memoria è abbastanza chiaro. Il più importante è il costo della memoria sulle istanze (soprattutto se le istanze sono piccole, ad esempio se intendono solo contenere un intero: in questo caso avere un puntatore virtuale in ogni istanza potrebbe raddoppiare la dimensione delle istanze. lo spazio di memoria utilizzato dalle tabelle virtuali, immagino che sia solitamente trascurabile rispetto allo spazio utilizzato dal codice del metodo effettivo.
Questo mi porta alla mia domanda: esiste un costo di prestazione misurabile (cioè impatto sulla velocità) per rendere virtuale un metodo? Ci sarà una ricerca nella tabella virtuale in fase di esecuzione, ad ogni chiamata di metodo, quindi se ci sono chiamate molto frequenti a questo metodo e se questo metodo è molto breve, potrebbe esserci un calo misurabile delle prestazioni? Immagino che dipenda dalla piattaforma, ma qualcuno ha eseguito alcuni benchmark?
Il motivo per cui lo chiedo è che mi sono imbattuto in un bug dovuto al fatto che un programmatore ha dimenticato di definire un metodo virtuale. Non è la prima volta che vedo questo tipo di errore. E ho pensato: perché ci aggiungiamo la parola chiave virtuale, se necessario, invece di rimuovere la parola chiave virtuale quando siamo assolutamente sicuri che sia non è necessaria? Se il costo delle prestazioni è basso, penso che consiglierò semplicemente quanto segue al mio team: rendi semplicemente virtuale ogni metodo per impostazione predefinita, incluso il distruttore, in ogni classe e rimuovilo solo quando necessario. Ti sembra folle?