C ++ - Funktion Zeiger inlining
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?
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.