2012-11-05 10 views
8

Dieser Teil der GCC-Handbuch ist ziemlich obskur und ich kann die Verwendung der Forceinline-Attribut nach wiederholten Versuchen nicht verstehen.Force Inline-Funktion in anderen Übersetzungseinheit

Ich definiere ein Objekt und bestimmte Funktionen, um dieses Objekt zu manipulieren. Nur wenige dieser Funktionen können atomare Anweisungen verwenden, und ich möchte, dass der Compiler diese Funktionen verknüpft. Allerdings möchte ich diese Funktionen nicht in die Header-Datei schreiben und sie mit "static inline" wie im Linux-Kernel deklarieren.

Gibt es eine Möglichkeit, gcc zu Inline-Funktionen von einer anderen Übersetzungseinheit zu erzwingen?

Antwort

9

können Sie das always_inline Attribut verwenden, zum Beispiel:

void foo() __attribute__((always_inline)); 

Vom docs

always_inline Im Allgemeinen werden Funktionen nicht inlined es sei denn, Optimierung angegeben ist. Bei inline deklarierten Funktionen wird die Funktion in das Attribut eingeschlossen, auch wenn keine Optimierungsebene angegeben wurde.

Note1: Es gibt keine Notwendigkeit inline zu verwenden, wenn Sie das always_inline Attribut

Note2: Ist die Funktion nicht inline sein könnte erhalten Sie eine Warnung, ist die Definition, wenn beispielsweise nicht zur Verfügung, wenn jedoch kompilieren, um eine höhere Optimierung gcc immer noch in die Anrufer Inline kann, gibt es einen speziellen Schalter für das auch:

-funit-at-a-time 

Von der docs:

Optimierungsstufen -O2 und höher, insbesondere ermöglichen Einheit-at-a-time-Modus, die die Compiler aus späteren Funktionen in der Datei gewonnenen Informationen berücksichtigen kann, wenn eine Funktion Kompilieren . Kompilieren mehrerer Dateien auf einmal zu einer einzigen Ausgabedatei Einheit-auf-Zeit-Modus ermöglicht dem Compiler, Informationen aus alle Dateien beim Kompilieren von jedem von ihnen gewonnen.

Note3: Es ist nicht notwendig, einen expliziten Prototyp haben, so dass Sie das Attribut auf die Funktion defintion verwenden können:

__attribute__((always_inline)) void foo() { 
    //some code 
} 

Auch diese discussion sehen, beantwortet sie einige Ihrer Fragen.

+0

funktioniert es auch, wenn die Definition der Funktion nicht verfügbar ist, wenn eine bestimmte Einheit kompiliert wird? Wie behandelt der Compiler eine solche Situation? – sgupta

+1

@ user1075375 Wie kann die Definition einer Funktion nicht verfügbar sein? es muss dort sein, sonst wird es nicht kompilieren/verknüpfen – iabdalkader

+1

"Wenn eine Funktionsimplementierung nicht in der Headerdatei und in einer separaten Kompilierungseinheit ist, kann es nicht inlined sein, es sei denn, Sie haben einen Compiler, der LTCG ausführen kann" von http: // stackoverflow.com/questions/5187735/how-to-inline-string-h-funktion-on-linux?rq = 1 – sgupta