__inline-Funktionen von vs normale Funktionen in C
Studiere ich die Makros und fand viele Quellen und Fragen zum Unterschied zwischen Makros und inline-Funktionen. Aber es gibt nichts, was konkret spezifiziert und differenziert vor - &Nachteile der inline-vs normalen Funktionen.
Aber was ist, wenn ich will, zu wählen zwischen der normalen Funktion und inline-Funktion?
Ich weiß, dass die Nutzung der inline-Funktion erhöht die code-Größe. Aber als während des Studiums die Größe ist nicht das primäre Problem , Effizienz ist das Ziel. Macht eine Funktion zu einer inline-Funktion deutet darauf hin, dass Aufrufe der Funktion werden so schnell wie möglich.(Wegen stack und so Zeug overhead)
Ist immer die Verwendung von inline-Funktion ist besser, oder nicht? Wenn nicht, dann WARUM? Was sind die Vorteile der Verwendung von normalen Funktionen über inline?
Beim Lesen der anderen Fragen habe ich gelesen, dass inline ist nur ein Hinweis für compiler. Compiler kann es ignorieren. Wann kommt compiler es ignorieren und WARUM?
Es gibt keine goldene Regel. Manchmal ist es besser, inline (spart einen Funktionsaufruf-stack-Manipulationen), manchmal lohnt es sich nicht (code-Größe zu stark ansteigt). Finden Sie nicht Die einzig Wahre Antwort, dann existiert es nicht.
fine, was über andere. Ich verwende rekursive Funktion sehr weniger.
Die compiler-Entscheidung, die inline ist in der Regel beschlossen, mit einem heuristic.
Nur eine Bemerkung am Rande, mit Bezug auf das, was passieren muss mit einem
inline
markierte Funktion, die es nicht schaffen, linker Konflikte, wenn seine definition tritt in mehreren compilation-units. So können Sie sicher steckte es in eine header-Datei. In diesem Sinne inline
macht es möglich, die eine Funktion ist eingebettet in mehrere Einheiten.InformationsquelleAutor Abhishek Gupta | 2012-04-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Inlining einer Funktion kann mehrere Vorteile haben:
Kann das Programm die Größe kleinere. Dies ist typischerweise der Fall, wenn eine Funktion nur einmal verwendet. Siehe auch, 2. und 3.
Kann der compiler beseitigen ungenutzten bits bei der Funktion, wenn der compiler weiß, dass eine variable konstant ist, oder nicht-NULL ist, oder so ähnlich. Dies kann sparen Sie Größe, sondern macht auch den code während der Laufzeit effizienter.
Kann der compiler beseitigen bits der aufrufenden Funktion, oder auch andere inline-Funktionen, da Sie sehen können, was die Funktion bedeutet mit/an den Daten. (Sagen, der code den Rückgabewert überprüft, und fordert eine error-Funktion, wenn es ist NULL, es könnte in der Lage sein zu herrschen, dass aus.
Kann es zu reduzieren die call-overhead, aber in der aktuellen Prozessoren mit predictive verzweigen, die nicht so viel gewinnen, wie Sie vielleicht denken.
Kann es Hebezeug constant bit aus Schleifen, tun, common subexpression elimination, und viele weitere Optimierungen machen die looping-code effizienter, und dergleichen.
Und dann gibt es die Nachteile:
Kann er den code größer, offensichtlich.
Kann es registrieren von Druck innerhalb der aufrufenden Funktion, die verwirren könnten, die compiler und verhindern, dass es zu optimieren als auch.
Dass ein hot-Funktion, können live in den CPU-cache kann schneller sein als Sie zu duplizieren, zu viele Orte, die nicht immer zwischengespeichert.
Kann es erschweren debugging.
Dem Grund, dass die inline-Funktion ist nur ein Hauch ist vor allem, weil der C-standard verlangt nicht, dass der compiler optimieren, überhaupt nichts. Wenn es nicht ein Hinweis dann Optimierung wäre nicht optional. Auch, weil die Funktion nicht markiert inline-zwar nicht die compiler inlining, wenn es berechnet, dass dies so von Vorteil wäre.
inline
Tipp, und nutzen Sie einfach Optimierungs-flags im Makefile zu inline, wie der compiler passen.InformationsquelleAutor ams
In der Regel der compiler wählen Sie inline, wenn es entscheidet, dass die Leistung besser sein wird. Es muss also vergleichen Sie die Kosten der tatsächlich den Aufruf der nicht-inline-Funktion (schiebt die Argumente auf den stack, speichern von Registern etc) ist mehr als der code selbst. Also für einfache Zugriffsmethoden, oder einfache Berechnungen ist es oft der Fall, dass die Kosten für den Aufruf einer Funktion mehr, daher wird der compiler inline.
Compiler haben oft Größenbeschränkungen zu, so dass Sie nicht zulassen, inlining zu wachsen, den code zu viel.
Es ist auch der Ort zu berücksichtigen. Eine inline-Funktion nicht wahrscheinlich, verursachen einen Seitenfehler, wird wahrscheinlich nicht bewirken, dass ein Prozessor-cache-miss, so wird im Allgemeinen schneller aus dieser Sicht. Nicht-inline-Funktionen erfordern oft code in den Prozessor geladen werden der cache, die ist sehr langsam im Vergleich.
Gibt es andere Gründe für das deklarieren von Funktionen zu inline -, auch wenn Sie nicht wirklich erwarten, dass der compiler inline. Die ganze STL in C++ ist inlined, obwohl es unwahrscheinlich ist, dass die meisten es jemals tatsächlich inlined. Es ist auf diese Weise getan, aus Gründen der template-Instanziierung, und Fragen im Zusammenhang mit application binary interfaces und so weiter.
Wenn du willst, dann pls ausführlich auf die Größe constraint-Teil und ich denke, dass Brett ' s Kommentar ist meine Antwort.
Der compiler hat eine Reihe von Optionen für die Kontrolle, was Größe, Funktion inlined. Zum Beispiel
--param max-inline-insns-single=<num>
Kontrollen inlining von Funktionen, die aufgerufen werden, von nur einem Ort. Es gibt mehrere wie.InformationsquelleAutor Tom Quarendon
Die Vorteile von inlining einer Funktion ist das entfernen der Funktionsaufruf-overhead und gibt dem Optimierer eine bessere chance, die Optimierung der aufrufende code die Funktion code. Zum Beispiel kann der Optimierer komplett eliminieren die inline-code, der unter bestimmten Umständen.
Der Nachteil ist die Möglichkeit der Erhöhung Ihrer code-Größe, die unter bestimmten Umständen können auch verlangsamen der Ausführungsgeschwindigkeit, wenn der Flaschenhals ist die CPU instruction fetch.
Also es hängt davon ab. Compiler verwenden verschiedene Heuristiken, um herauszufinden, ob inlining einer Funktion ist ein Netto-Vorteil. Ein compiler kann die inline Funktion auch wenn Sie nicht angeben der inline-Schlüsselwort oder es kann nicht inline, wenn Sie tun. Es gibt in der Regel Möglichkeiten, von zwingen, einen compiler inline die Funktion zu überschreiben, seine Entscheidung.
Diese Was sind gute Heuristiken für das inlining von Funktionen? hat sich eine gute Diskussion und weitere links in Bezug auf inlining-Heuristik.
Beschimpfte die Menschen, die versuchen, zu helfen, Sie ist nicht wirklich eine gute Politik.
Ich bin nicht nur zu wiederholen, was Sie sagte. Ich bin auch zu sagen, dass code-Erhöhung führen kann, reduziert die Leistung, so gibt es mehr zu inlining, als einfach nur code-Größe. Es kann sich erhöhen oder verringern code-Größe und es kann zu erhöhen oder verringern die Leistung.
InformationsquelleAutor Guy Sirton
Wenn Sie eine inline-Funktion, die Funktion code wird eingefügt in die Zeile, wenn Sie aufgerufen wird, erzeugt es auch eine ausführbare Programm größer als die, die, die nicht mit inline-Funktionen, in der anderen hand, eine nicht-inline-Funktion, wenn Sie aufgerufen wird, das Programm beenden und springt auf das Speicher dir, wo die Funktion code start...
Fazit:
inline-Funktion = bessere Leistung, mehr Platz
Funktion = weniger Platz, eine leicht weniger Leistung
InformationsquelleAutor DGomez
Gibt es eine ziemlich gute übersicht der gcc-inlining-Optionen und die Entscheidung, die Prozesse zu GNU GCC.
Identifizierung der Fälle, in denen inlining ist nicht möglich: "die Verwendung von varargs verwenden von alloca, die Verwendung von variabler Größe-Datentypen, Verwendung von computed goto, Verwendung von nichtlokales "goto", und verschachtelte Funktionen"
Ein wichtiger Punkt ist eine nicht-statische Funktion, ich.e man mit
extern
Verknüpfung (das ist alle Funktionen, die deklariert, ohnestatic
) kann aufgerufen werden, oder haben Sie seine Adresse in einer anderen source-Datei.Dies zwingt den compiler zu generieren eine "normale" Funktion als auch für alle inline-Funktion stellen. Diese, natürlich, erzeugt ein Programm, welches größer ist als nur die Generierung der 'normalen' nicht-inline-Funktion.
Gcc hat die option,
-ffunction-sections
das generieren von Objekt-Dateien, die es ermöglichen, den linker zu beseitigen-Funktionen, die nicht verwendet werden, die auf Kosten der "... der assembler und der linker erstellen größere Objekt-und ausführbaren Dateien und werden auch langsamer."Auf neuere Versionen von gcc, Link-Time-Optimierung (LTO) (siehe "Ganze Programm-Optimierungen") unterstützt wird. Dies ermöglicht eine Optimierung Bühne zu betrachten alle das kompilierte Programm, und noch mehr aggressive inlining und Optimierung, und schließen Sie nicht verwendete code.
Interessant ist auch ein Blick auf einige der neueren gcc-4.6 gcc-4.7 Interprozedurale Optimierungen. Zum Beispiel inline-ing nur der "heiße Pfad" von einer inline-Funktion, anstatt die gesamte Funktion. Gcc kann auch das erstellen mehrerer Instanzen einer Funktion, da die Konstanten bekannt sind, und gcc berechnet, es ist besser, mehrere Implementierungen, jeweils optimiert für diejenigen, bekannte Konstanten.
Gibt es Optionen des gcc zu Fragen, für die der compiler inline alle "einfach genug" Funktionen.
Schließlich heißt es "Als erforderlich, die durch ISO-C++, GCC Auffassung member-Funktionen definiert, die innerhalb des Körpers einer Klasse zu Kennzeichnen, inline, auch wenn Sie nicht explizit deklariert mit dem Schlüsselwort inline". In dem Fall die Regel für "einfach genug" verwendet wird.
Zusammenfassung: der compiler kann sehr clevere Optimierungen über das hinaus, was erwartet werden kann von den gewöhnlichen Funktionen oder inline-Funktionen.
Alle Funktionen, die deklariert sind, ohne das Wort
static
sind nicht statisch. Das bedeutet, die Funktion istextern
Verknüpfung, und damit ist sichtbar, die außerhalb der Datei (compilation unit), um alle den rest des Programms. Das bedeutet, dass der compiler muss erzeugen einer 'normalen' Funktion, wenn die Funktion aufgerufen wird anderswo oder sogar, dass so etwas dauert seine Adresse (also es müssen nicht genannt werden). Der linker kann beseitigen die generierten extern-Funktion wenn die Funktion nie aufgerufen wird, und die Adresse wird nicht übernommen.Der linker kann nur beseitigt Funktionen, wenn der code kompiliert wurde, mit
-ffunction-sections
und verbunden mit--gc-sections
. Die compiler-Optionen-fwhole-program
und-flto
sind auch in der Lage, eliminieren Sie ungenutzte extern-Funktionen (nicht zu vergessen die inline-Funktionen aus anderen C-Dateien).ja, im Wert hinzufügt. Danke.
InformationsquelleAutor gbulmer