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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top