Angenommen, ich habe diese kleine Funktion in einer Quelldatei
static void foo() {}
und ich erstelle eine optimierte Version meiner Binärdatei, möchte diese Funktion jedoch nicht inline (für Optimierungszwecke). Gibt es ein Makro, das ich einem Quellcode hinzufügen kann, um das Inlining zu verhindern?
Antworten:
Sie möchten das Attribut
gcc
-spezifischnoinline
.Verwenden Sie es so:
quelle
GCC hat einen Schalter namens
-fno-inline-small-functions
Verwenden Sie dies also, wenn Sie gcc aufrufen. Der Nebeneffekt ist jedoch, dass alle anderen kleinen Funktionen ebenfalls nicht inline sind.
quelle
-fno-inline
funktionieren überhaupt nicht.gdb
gibt immer noch Methoden beim Step-Over ein. Etwas ist kaputt und ich bezweifle esgdb
.Eine tragbare Möglichkeit, dies zu tun, besteht darin, die Funktion über einen Zeiger aufzurufen:
Dies führt jedoch zu unterschiedlichen Anweisungen zum Verzweigen, was möglicherweise nicht Ihr Ziel ist. Was einen guten Punkt aufwirft: Was ist Ihr Ziel hier?
quelle
Ich weiß, dass es sich bei der Frage um GCC handelt, aber ich dachte, es könnte nützlich sein, einige Informationen über Compiler und andere Compiler zu haben.
Das
noinline
Funktionsattribut von GCC ist auch bei anderen Compilern sehr beliebt. Es wird unterstützt von mindestens:__has_attribute(noinline)
)__TI_GNU_ATTRIBUTE_SUPPORT__
)Darüber hinaus unterstützt MSVC die
__declspec(noinline)
Rückkehr zu Visual Studio 7.1. Intel unterstützt es wahrscheinlich auch (sie versuchen, sowohl mit GCC als auch mit MSVC kompatibel zu sein), aber ich habe mir nicht die Mühe gemacht, dies zu überprüfen. Die Syntax ist grundsätzlich dieselbe:PGI 10.2+ (und wahrscheinlich älter) unterstützt ein
noinline
Pragma, das für die nächste Funktion gilt:TI 6.0+ unterstützt ein
FUNC_CANNOT_INLINE
Pragma, das (ärgerlicherweise) in C und C ++ unterschiedlich funktioniert. In C ++ ähnelt es den ggA:In C ist jedoch der Funktionsname erforderlich:
Cray 6.4+ (und möglicherweise früher) verfolgt einen ähnlichen Ansatz und erfordert den Funktionsnamen:
Oracle Developer Studio unterstützt auch ein Pragma, das den Funktionsnamen verwendet und mindestens auf Forte Developer 6 zurückgeht . Beachten Sie jedoch, dass es auch in neueren Versionen nach der Deklaration erfolgen muss:
Abhängig davon, wie engagiert Sie sind, könnten Sie ein Makro erstellen, das überall funktioniert, aber Sie müssten den Funktionsnamen sowie die Deklaration als Argumente haben.
Wenn Sie, OTOH, mit etwas einverstanden sind, das nur für die meisten Menschen funktioniert, können Sie mit etwas davonkommen, das etwas ästhetischer ist und bei dem Sie sich nicht wiederholen müssen. Das ist der Ansatz, den ich für Hedley gewählt habe , wo die aktuelle Version von HEDLEY_NEVER_INLINE so aussieht:
Wenn Sie Hedley nicht verwenden möchten (es ist ein einzelner Public Domain / CC0-Header), können Sie die Versionsprüfungsmakros ohne großen Aufwand konvertieren, aber mehr, als ich bereit bin, ☺ einzugeben.
quelle
Falls Sie einen Compilerfehler für erhalten
__attribute__((noinline))
, können Sie einfach versuchen:quelle
Das hat bei mir funktioniert.
quelle
Verwenden Sie das
noinline
Attribut :Sie sollten es wahrscheinlich sowohl verwenden, wenn Sie die Funktion für den externen Gebrauch deklarieren, als auch wenn Sie die Funktion schreiben.
quelle
Ich arbeite mit gcc 7.2. Ich brauchte speziell eine Funktion, um nicht inline zu sein, weil sie in einer Bibliothek instanziiert werden musste. Ich habe sowohl die
__attribute__((noinline))
Antwort als auch dieasm("")
Antwort ausprobiert . Keiner löste das Problem.Schließlich stellte ich fest, dass das Definieren einer statischen Variablen innerhalb der Funktion den Compiler dazu zwingt, Speicherplatz im statischen Variablenblock zuzuweisen und beim ersten Aufruf der Funktion eine Initialisierung dafür auszugeben.
Dies ist eine Art schmutziger Trick, aber es funktioniert.
quelle
inline void foo(void) { ... }
in einem Header definieren undextern inline void foo(void);
in einer Bibliotheksquelldatei deklarieren . Nach der C99-Semantik kann der Compiler die Funktion einbinden, wenn es ihm gefällt UND Objektcode in Ihrer Bibliothek ausgeben. Siehe Ist "Inline" ohne "statisch" oder "extern" in C99 jemals nützlich? .