2015-03-11 11 views
6

Ich habe einige Posts über die Verwendung von static inline und inline gelesen und dabei Funktionen in Header-Dateien für den Zugriff über mehrere Übersetzungseinheiten definiert. Es scheint wie inline ist der richtige Weg zu gehen aufgrund der externen Verknüpfung.Codegröße: statisch inline vs. inline für Funktionen, die in Header-Dateien definiert sind

ist meine Frage über die resultierende Codegröße als Folge der Verwendung von inline Spezifizierer, wenn Funktionen in .h-Dateien definieren:

  • Ist der Code Expansion durch inline noch weniger als erzeugt, was durch static inline verursacht werden würde ?

  • Warum ist eine extern inline Deklaration in der entsprechenden .c-Datei erforderlich?

+0

Wenn Sie sich Sorgen machen, dass Ihre Inline-Funktionen möglicherweise nicht inline sind, sollten Sie sie vielleicht gar nicht in Zeilen einfügen? Wenn Sie sich keine Sorgen machen, dann wird der Compiler sowieso den Code einbinden, und die Code-Erweiterung (die Ihnen vermutlich einen Geschwindigkeitsvorteil bringen sollte; wenn es nicht so ist, gab es keinen Sinn, die Funktion an erster Stelle zu markieren) sollte akzeptabel sein. Verwenden Sie nicht "inline" willy-nilly. Verwenden Sie es mit Vorsicht und Urteil, und im Zweifelsfall, verwenden Sie es nicht. Siehe auch [Ist 'inline' ohne' static' oder 'extern' jemals in C99 nützlich?] (Http://stackoverflow.com/questions/6312597) –

+0

Der Grund für die Verwendung von inline in meinem Code ist im Grunde genommen für die Definition von Funktionen in die Header-Datei. Ohne Inline/Static Inline klagt der Compiler über mehrere Symboldefinitionen. Ich bin ein bisschen besorgt über die Codegröße, aber hauptsächlich versuche ich zu sehen, welcher Weg mir mehr Nutzen bringt, dh weniger Codeerweiterung - Inline oder statische Zeile. – thegeeklife

+0

@thegeeklife: Plain 'inline' (zusammen mit' extern inline' in eine '.c' Datei wäre die bessere dieser beiden Optionen. Das bedeutet, dass Sie eine einzelne logische Funktion erstellen, anstatt wie in meiner Antwort beschrieben, Sie sollten überlegen, ob Sie wirklich Code in Kopfzeilen benötigen um Code in '.c' Dateien zu haben, und Sie riskieren nicht, den Compiler dazu zu bringen, Dinge zu inlinern, die es sonst nicht hätte (was Jonackon zufolge darauf hinweist, was Sie sich Sorgen machen) Die Datei, in die Sie das 'extern inline 'einfügen würden, wäre wahrscheinlich ein logischer Platz, um die Definition stattdessen zu setzen. – Ulfalizer

Antwort

5

Es könnte kleineren Code generieren. Der Grund ist, dass inline (im Gegensatz zu static inline) die Funktion externe Verknüpfung gibt, so dass alle Aufrufe der Funktion von verschiedenen Übersetzungseinheiten auf die gleiche logische Funktion verweisen. Mit static inline erhält jede Übersetzungseinheit stattdessen eine eindeutige Instanz der Funktion, die die Code-Größe erhöhen könnte, wenn der Compiler keine Inline-Anweisung wählt. (Es ist auch cleaner, nicht mehrere identische Funktionen zu haben.)

Der Grund, warum Sie extern irgendwo brauchen, ist, weil es den Compiler erzeugt eine externe Definition der Funktion, die von anderen Übersetzungseinheiten aufgerufen werden kann. Ohne extern wird keine solche Instanz generiert. Der Fall extern unterscheidet sich von der internen Verknüpfung darin, dass die inline Definition nur eine "Alternative" zur externen Definition der Funktion bietet. Eine externe Definition muss noch vorhanden sein (d. H. Einige Übersetzungsfunktionen müssen extern verwenden, um eine externe Definition zu generieren), und der Compiler kann sie verwenden, anstatt sie zu verwenden.

Hier einige relevanten standardese (für C11: ISO/IEC 9899: 2011 §6.7.4 Funktion Bezeich ¶7):

Jede Funktion mit interner Verknüpfung kann eine Inline-Funktion sein. Für eine Funktion mit externer Verknüpfung gelten folgende Einschränkungen: Wenn eine Funktion mit einem Funktionsbezeichner inline deklariert ist, muss sie auch in derselben Übersetzungseinheit definiert sein. Wenn alle Dateibereichsdeklarationen für eine Funktion in einer Übersetzungseinheit den Funktionsspezifizierer inline ohne extern enthalten, ist die Definition in dieser Übersetzungseinheit eine Inline-Definition. Eine Inline-Definition stellt keine externe Definition für die Funktion bereit und verbietet keine externe Definition in einer anderen Übersetzungseinheit. Eine Inline-Definition bietet eine Alternative zu einer externen Definition, die ein Übersetzer verwenden kann, um einen Aufruf der Funktion in derselben Übersetzungseinheit zu implementieren. Es ist nicht angegeben, ob ein Aufruf der Funktion die Inline-Definition oder die externe Definition verwendet. 140)

140) Da eine Inline-Definition unterscheidet sich von der entsprechenden externen Definition und von irgendwelchen anderen entsprechenden Inline-Definitionen in anderen Übersetzungseinheiten, alle entsprechenden Objekte mit statischen Speicher Dauer sind auch verschieden in jedem die Definitionen.

By the way, inline ist IMO oft nicht lohnt (als Hinweis - der Compiler noch frei ist nicht zu inline) im Vergleich zu einfach lassen den Compiler wählen, wenn rein inline auf seine eigene. Für moderne Compiler, die die Link-Zeit-Optimierung unterstützen, kann der Compiler sogar Inline-Funktionen über Übersetzungseinheiten hinweg verwenden, wenn Sie die richtigen Flags übergeben (z. B. -flto in GCC).

+0

Ausgezeichnete Antwort, aber wenn Sie 'inline' schreiben, lassen Sie (normalerweise) immer noch den Compiler wählen, ob die Funktion inline ist. –

+0

@DietrichEpp: Ich wollte das ausdrücken, aber vielleicht habe ich versagt. Ich werde darüber gehen und sehen, ob es geklärt werden kann. – Ulfalizer

+0

Ich habe gerade den unteren Absatz gelesen, als ich das geschrieben habe. –