Dire che ho una chiamata di funzione virtuale foo() su un puntatore astratto di classe base, mypointer-> foo(). Quando la mia app si avvia, in base al contenuto di un file, sceglie di istanziare una particolare classe concreta e assegna mypointer a quell'istanza. Per il resto della vita dell'app, mypointer sarà sempre puntare agli oggetti di quel tipo concreto. Non ho modo di sapere cosa sia questo tipo concreto (può essere istanziato da una fabbrica in una libreria caricata dinamicamente). So solo che il tipo rimarrà lo stesso dopo la prima volta che viene eseguita un'istanza del tipo concreto. Il puntatore potrebbe non puntare sempre allo stesso oggetto, ma l'oggetto sarà sempre dello stesso tipo concreto. Si noti che il tipo è determinato tecnicamente in "runtime" perché è basato sul contenuto di un file, ma che dopo "avvio" (il file è caricato) il tipo è fisso.È possibile memorizzare nella cache una ricerca di funzioni virtuali in C++?
Tuttavia, in C++ pago il costo di ricerca della funzione virtuale ogni volta che viene chiamato foo per l'intera durata dell'app. Il compilatore non può ottimizzare il look up perché non c'è modo di sapere che il tipo di calcestruzzo non varierà in fase di esecuzione (anche se è stato il compilatore più incredibile di sempre, non può speculare sul comportamento del carico dinamico biblioteche). In un linguaggio JIT compilato come Java o .NET, il JIT può rilevare che lo stesso tipo viene utilizzato più volte e lo fa inline cacheing. Sono fondamentalmente alla ricerca di un modo per farlo manualmente per puntatori specifici in C++.
C'è qualche modo in C++ per memorizzare questa ricerca nella cache? Mi rendo conto che le soluzioni potrebbero essere piuttosto schifose. Sono disposto ad accettare gli hack specifici di ABI/compilatore se è possibile scrivere test di configurazione che scoprano gli aspetti rilevanti dell'ABI/compilatore in modo che sia "praticamente portatile" anche se non veramente portatile.
Aggiornamento: Per gli oppositori: se non valeva la pena ottimizzare, allora dubito che le moderne JIT lo farebbero. Pensi che gli ingegneri di Sun e MS stiano sprecando il loro tempo nell'implementazione dell'archiviazione in linea e non l'abbiano messo a punto per garantire un miglioramento?
Sarebbe interessante vedere se LLVM può fare il trucco JIT su questo ... – Javier
È la rasatura un'extradection in più che vale tutto l'hackish che questo comporterebbe? Sembra abbastanza hardcore. Posso pensare a due modi per farlo: 1. Applicare tutte le chiamate alla funzione virtuale con l'indirizzo risolto, nel codice dell'oggetto caricato. Potresti essere in grado di hackerare il linker per farlo per te. 2. Utilizzare trampolini. Ma non so se questo avrebbe lo stesso sovraccarico di puntatori di funzione, o anche di più. Provare entrambi, misurare e vedere. :-P –
Perché credi che il costo di ricerca della funzione virtuale valga anche la pena di ottimizzare? Ricorda: "L'ottimizzazione prematura è la radice di tutti i mali". –