Frage

Ich weiß, ich kann einen Funktionszeiger als Vorlagenparameter übergeben und einen Aufruf einbeziehen, aber ich habe mich gefragt, ob irgendwelche Compiler heutzutage eine "offensichtliche" inline-können-Funktion wie folgt:

inline static void Print()
{
 std::cout << "Hello\n";
}

....

void (*func)() = Print;

func();

Unter Visual Studio 2008 ist es klug genug, um es auf einen direkten Anruf zu bringen, so dass es eine Schande scheint, dass es nicht weiter gehen kann?

War es hilfreich?

Lösung

G ++ 4,5 von GNU stellt es für mich ein, mit der Optimierungsstufe -O1 zu beginnen

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

Wo .lc0 ist das .String "Hallo n".

Um ohne Optimierung G ++ -O0 zu vergleichen, war es nicht inline:

main:
    pushq   %rbp
    movq    %rsp, %rbp
    subq    $16, %rsp
    movq    $_ZL5Printv, -8(%rbp)
    movq    -8(%rbp), %rax
    call    *%rax
    movl    $0, %eax
    leave
    ret

Andere Tipps

Neuere Veröffentlichungen von GCC (4.4 und Up) haben eine Option mit dem Namen -findirect -Inline. Wenn GCC sich selbst beweisen kann, dass der Funktionszeiger konstant ist, wird der Funktion direkt auf die Funktion aufgerufen oder die Funktion vollständig eingebaut.

Nun, der Compiler weiß nicht wirklich, ob diese Variable irgendwo überschrieben wird oder nicht (vielleicht in einem anderen Thread?), Damit er sich auf der Seite der Vorsicht fehlerhaft erfüllt und ihn als Funktionsaufruf implementiert.

Ich habe gerade in VS2010 in einem Release -Build eingecheckt und es wurde nicht eingebaut.

Übrigens dekorieren Sie die Funktion als inline ist nutzlos. Der Standard besagt, dass, wenn Sie jemals die Adresse einer Funktion erhalten, alle inline Tipp wird ignoriert.

bearbeiten: Beachten Sie jedoch, dass Ihre Funktion zwar nicht eingefügt wurde, die Variable verschwunden ist. In der Demontage die call Verwendet eine direkte Adresse, lädt die Variable nicht in ein Register und ruft diese auf.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top