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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top