C ++ puntatore a funzione inlining
Domanda
So di poter passare un puntatore a funzione come parametro di template e ottenere una chiamata ad essa inline, ma mi chiedevo se qualsiasi compilatori in questi giorni può inline una funzione inline-grado 'ovvia' come:
inline static void Print()
{
std::cout << "Hello\n";
}
....
void (*func)() = Print;
func();
In Visual Studio 2008 la sua abbastanza intelligente per arrivare verso il basso per un'istruzione di chiamata diretta in modo da sembra un peccato che non può prendere un ulteriore passo avanti?
Soluzione
g di GNU ++ 4.5 inline per me a partire dal livello di ottimizzazione -O1
main:
subq $8, %rsp
movl $6, %edx
movl $.LC0, %esi
movl $_ZSt4cout, %edi
call _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_E
movl $0, %eax
addq $8, %rsp
ret
dove .LC0 è il .string "Ciao \ n".
Per confrontare, senza ottimizzazione, g ++ -O0, lo ha fatto non in linea:
main:
pushq %rbp
movq %rsp, %rbp
subq $16, %rsp
movq $_ZL5Printv, -8(%rbp)
movq -8(%rbp), %rax
call *%rax
movl $0, %eax
leave
ret
Altri suggerimenti
versioni più recenti di GCC (4.4 e versioni successive) avere un'opzione di nome -findirect-inlining. Se GCC può rivelarsi sé che il puntatore funzione è costante, allora effettua una chiamata diretta alla funzione o Inlines la funzione del tutto.
Bene il compilatore non so davvero se tale variabile sarà da qualche parte sovrascritto o meno (forse in un altro thread?) In modo che sbaglia sul lato della cautela e implementa come una chiamata di funzione.
Ho appena controllato in VS2010 in una build di rilascio e non ha ottenuto inline.
A proposito, si decorando la funzione come inline
è inutile. Lo standard dice che se mai l'indirizzo di una funzione, ogni accenno inline
verrà ignorata.
modifica : Nota tuttavia che, mentre la funzione non ha ottenuto inline, la variabile è andato. Nel smontaggio del call
utilizza un indirizzo diretto, non carica la variabile in un registro e chiamate.