c ++ pointeur de fonction inline
Question
Je sais que je peux passer un pointeur de fonction en tant que paramètre de modèle et d'obtenir un appel à ce inline, mais je me demandais si les compilateurs ces jours-ci peuvent inline une « évidente » fonction inline-mesure comme:
inline static void Print()
{
std::cout << "Hello\n";
}
....
void (*func)() = Print;
func();
Dans Visual Studio 2008 son assez intelligent pour le faire descendre à une instruction d'appel direct il semble dommage qu'il ne peut pas prendre un peu plus loin?
La solution
g de GNU ++ 4.5 inline il pour moi à partir du niveau d'optimisation -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
où .LC0 est le .string "Bonjour \ n".
Pour comparer, sans optimisation, g ++ -O0, il n'a pas en ligne:
main:
pushq %rbp
movq %rsp, %rbp
subq $16, %rsp
movq $_ZL5Printv, -8(%rbp)
movq -8(%rbp), %rax
call *%rax
movl $0, %eax
leave
ret
Autres conseils
Les nouvelles versions de GCC (4.4 et plus) ont une option nommée -findirect-inline. Si GCC peut se révéler elle-même que le pointeur de fonction est constante, alors il fait un appel direct à la fonction ou inline entièrement la fonction.
Eh bien, le compilateur ne sait pas vraiment si cette variable sera écrasé quelque part ou non (peut-être dans un autre thread?) Il commet une erreur sur le côté de la prudence et met en œuvre comme un appel de fonction.
Je viens de vérifier dans VS2010 dans une version release et il ne me suis pas inline.
Par ailleurs, vous la décoration de la fonction comme inline
est inutile. La norme dit que si jamais vous obtenez l'adresse d'une fonction, toute velléité de inline
sera ignoré.
modifier : note cependant que si votre fonction ne s'inline, la variable est parti. Dans le démontage du call
utilise une adresse directe, il ne charge pas la variable dans un registre et appels.