Nun, es gibt keine Garantie durch den Standard, dass inline
Funktionen tatsächlich inline sind; Man muss Makros verwenden, um 100% Garantie zu haben. Der Compiler entscheidet unabhängig von dem inline
-Schlüsselwort immer auf Basis seiner eigenen Regeln, welche Funktion eingebunden ist oder nicht.
Wann wird das Schlüsselwort inline
tatsächlich etwas bewirken, was der Compiler macht, wenn er moderne Compiler wie die aktuelle Version von GCC verwendet?
Es hat einen semantischen Effekt. Zur Vereinfachung kann eine mit inline
gekennzeichnete Funktion in einem Programm mehrfach definiert werden - obwohl alle Definitionen einander entsprechen müssen. Daher ist die Anwesenheit von inline
für die Korrektheit erforderlich, wenn die Funktionsdefinition in die Header eingefügt wird (also in drehen, macht die Definition sichtbar, so dass der Compiler sie ohne LTO inline einbinden kann.
Abgesehen davon ist "nie" für die Inline-Optimierung eine vollkommen sichere Näherung. Es hat wahrscheinlich einige Auswirkungen in einigen Compilern, aber nichts, das den Schlaf zu verlieren lohnt, vor allem nicht ohne tatsächliche harte Daten. Im folgenden Code, mit Clang 3.0 oder GCC 4.7 , enthält main
beispielsweise denselben Code, unabhängig davon, ob work
als% markiert ist. co_de% oder nicht. Der einzige Unterschied besteht darin, ob inline
als Standalone-Funktion für andere Übersetzungseinheiten zum Verknüpfen mit oder zum Entfernen bleibt.
Wenn Sie Inlining steuern möchten, halten Sie sich an alle Pragmas oder Attribute, die Ihr Compiler bereitstellt, um dieses Verhalten zu steuern. Zum Beispiel __attribute__((always_inline))
auf GCC und ähnliche Compiler. Wie Sie bereits erwähnt haben, wird das Schlüsselwort inline
oft ignoriert, abhängig von den Optimierungseinstellungen usw.
Tags und Links c inline-functions