2016-06-18 38 views
1

Gibt es einen Punkt in der Angabe der Aufrufkonvention für eine Inline-Funktion? Zum Beispiel schreibe ich SIMD Math Bibliothek, wo es empfohlen wird, __vectorcall zu verwenden, aber alle meine Funktionen sind Inline. In einigen Artikeln habe ich Leute gesehen, die alle Funktionen eingezeichnet haben und immer noch sagen, dass Sie die Bibliothek mit der Standardkonvention __vectorcall kompilieren müssen (oder dieses Attribut tatsächlich setzen).
Ich kann den Unterschied in der Montage sehen, wenn die Funktion nicht inline ist. Aber was ist der Punkt, um die Aufrufkonvention für die Inline-Funktion anzugeben, da es sich nicht wirklich um einen Funktionsaufruf handelt? Ist es nicht besser, __vectorcall nur für Nicht-Inline-Funktion anzugeben?Inline-Funktionen und Aufrufkonventionen

+0

http://stackoverflow.com/a/36852518/2542702 –

Antwort

4

Das Inline-Schlüsselwort ist nur ein Vorschlag für den Compiler; es garantiert nicht, dass die Funktion inline ausgeführt wird. Beispielsweise kann eine rekursive Funktion nicht inline ausgeführt werden, und wenn Sie Funktionszeiger verwenden, muss der Compiler möglicherweise nicht inline Kopien von ansonsten inlined Funktionen generieren. Darüber hinaus können Einschränkungen für Speicher und Speicherplatz den Compiler daran hindern, eine Funktion zu inlinen.

Als Ergebnis werden Sie, auch wenn Sie eine Funktion inline markieren, immer noch eine Aufrufkonvention angeben, da es keine Garantie gibt, dass der Compiler tatsächlich den Funktionsaufruf eliminiert.

+0

"rekursive Funktion kann nicht inline" ausgeführt werden, wenn der Compiler in der Lage ist, Rekursion in Iteration zu optimieren, kann er inlined sein. Wenn der Compiler in der Lage ist, die Rekursionstiefe zur Kompilierzeit vorherzusagen, kann er entrollt und inlined ... –

+0

@Revolver_Ocelot Das stimmt, obwohl es im Allgemeinen keinen Weg für einen Compiler gibt, das zu tun (danke, Problem anhalten!) Weißt du? von irgendwelchen Compilern, die dies in anderen Fällen als Tail Call Elimination tun? – templatetypedef

+0

Sowohl GCC als auch Clang versuchen, die nicht ganz vollständige Rekursion in Iteration umzuwandeln. Ich habe keine Beweise für die teilweise nichtlineare rekursive Funktionen in Inline-Gliederung –