Ho letto un esempio su polimorfismo che assomiglia a soffietto, dove show() è una funzione virtuale:Perché non utilizzare l'associazione anticipata quando possibile?
int main()
{
Derived dv1;
Derived dv2;
Base* ptr;
ptr = &dv1;
ptr->show();
ptr = &dv2;
ptr->show();
}
I libri dicono che in questo caso, il compilatore utilizzerà late binding
tecnica. Comprendo la differenza tra l'associazione tardiva e l'associazione anticipata. Tuttavia, in questo esempio, noi (e forse anche il compilatore) possiamo vedere quale funzione dovrebbe essere chiamata perché non c'è alcun cambiamento negli oggetti a cui punta ptr
. Quindi, perché non legare in anticipo in questo caso perché l'associazione tardiva causerà un sovraccarico?
Come sai che il tuo compilatore in realtà non rileva quel caso e fa qualche ottimizzazione per questo? Hai controllato il codice assembler generato? Con le ottimizzazioni abilitate? –
Non ho familiarità con il codice assembler. Il fatto che i libri dicano che il legame tardivo è applicato in questo caso mi rende confuso. – Rickie
clang sembra almeno fare [a * bit * more] (https://godbolt.org/g/9pnkg9) piuttosto che ottimizzare le chiamate da derivare, almeno per le semplici implementazioni di 'show'. – jaggedSpire