UPDATE: Dopo alcune letture aggiuntive, quello che volevo veramente era l'associazione anticipata garantita (che dovrebbe essere tradotta in una chiamata immediata per funzioni non virtuali e codice non PIC), che può essere fatta passando una funzione (membro) come parametro del modello. Il problema che ho riscontrato è che gcc < 4.5 e icc 11.1 possono generare alcune funky istruzioni per le chiamate dei parametri del modello del puntatore function function. AFAICT, gcc> = 4,5 e vs2008 gestiscono bene queste chiamate dei parametri del modello.Dove sono i letterali degli indirizzi di funzione in C++?
Prima di tutto, forse letterali non è il termine corretto per questo concetto, ma è il più vicino che potrei pensare (non letterali nel senso di funzioni di cittadini di prima classe).
L'idea è che quando si effettua una chiamata di funzione convenzionale, si compila a qualcosa di simile:
callq <immediate address>
Ma se si effettua una chiamata di funzione tramite un puntatore a funzione, si compila a qualcosa di simile:
mov <memory location>,%rax
callq *%rax
Che va tutto bene. Tuttavia, cosa succede se sto scrivendo una libreria di modelli che richiede un callback di qualche tipo con un elenco di argomenti specificato e l'utente della libreria deve sapere quale funzione desidera chiamare al tempo di compilazione? Quindi vorrei scrivere il mio modello per accettare un valore letterale di funzione come parametro del modello. Così, simile a
template <int int_literal>
struct my_template {...};`
Mi piacerebbe scrivere
template <func_literal_t func_literal>
struct my_template {...};
e hanno chiamate a func_literal entro my_template compilare in callq <immediate address>
.
Esiste una funzione in C++ per questo o una soluzione per ottenere lo stesso effetto? In caso negativo, perché no (ad esempio alcuni effetti collaterali cataclismici)? Che ne dici di C++ 0x o di un'altra lingua?
Questo argomento è utile, poiché consente di scambiare diverse funzionalità durante l'esecuzione. Ad esempio, l'API DOS utilizza ID per mappare le funzioni. Ciò consente alla funzionalità DOS di cambiare con effetti minimi sull'eseguibile. Basta cambiare il contenuto (indirizzi di funzione) nella tabella di ricerca. –
I Functional in combinazione con i modelli sono in fase di compilazione. La maggior parte degli STL funziona così o c'è qualche avvertimento nel tuo problema? – pmr
@ avvertire che la soluzione non dovrebbe avere alcun impatto sul codice utente; se non stanno usando oggetti funzione, non voglio forzarli a usare oggetti funzione. – academicRobot