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
Antwort
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.
"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 ... –
@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
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 –
- 1. Callable Objekte mit verschiedenen Aufrufkonventionen
- 2. Was sind die Unterschiede zwischen C und C++ Aufrufkonventionen?
- 3. GCC MIPS-32 Aufrufkonventionen/Stack-Frame-Definition
- 4. Was die Aufrufkonventionen für UNIX und Linux-System sind fordert i386 und x86-64
- 5. Unterschied zwischen call und capi FFI Aufruf Konventionen
- 6. Liste von und Dokumentation für Systemaufrufe für XNU-Kernel in OSX
- 7. Warum ist die Laufzeitbibliothek eine Compileroption und keine Linkeroption?
- 8. Aufrufkonvention auf x64
- 9. Kann das Ein- und Ausschalten von PyFrameObjects eine gute Implementierung von Fortsetzungen sein?
- 10. Umleitung und GCC Inline Assembly (Linux)
- 11. Clojure vars und Java statische Methoden
- 12. SQL Server UND UND ODER UND UND
- 13. postgresQL Erweiterung Funktionen in C (Änderungen von v8.0x zu v9.0)?
- 14. Unterschied zwischen - und - oder 'und' oder "und"
- 15. SubSonic "Oder" und "UND"
- 16. "und" und Tail-Rekursion
- 17. SOX und Ein- und Ausblenden
- 18. QOpenGLWidget und glReadPixels und Tiefenpuffer
- 19. Flasche und Skalierung und Gleichzeitigkeit
- 20. Realm: kombinieren "oder" und "und"
- 21. ArrayList und String [] UND Objekt []
- 22. Python wenn Bedingung und "und"
- 23. Schienen und Markdown und Editor
- 24. Jack und Jill und destinationDir
- 25. Excel Multiple IF und UND
- 26. Spring und JSF und JPA
- 27. Kopf- und Fußzeile und Freemarker
- 28. Android und onSaveInstance und Restore
- 29. Hibernate und Transaktionen und Tabellensperren
- 30. „Und“ und „Oder“ auf NSPredicates
http://stackoverflow.com/a/36852518/2542702 –