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:
- Clang (erkundigen Sie sich bei
__has_attribute(noinline)
)
- Intel C / C ++ Compiler (ihre Dokumentation ist schrecklich, aber ich bin sicher, dass sie unter 16.0+ funktioniert)
- Oracle Solaris Studio zurück auf mindestens 12.2
- ARM C / C ++ Compiler zurück auf mindestens 4.1
- IBM XL C / C ++ zurück auf mindestens 10.1
- TI 8.0+ (oder 7.3+ mit --gcc, was definiert
__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:
__declspec(noinline)
static void foo(void) { }
PGI 10.2+ (und wahrscheinlich älter) unterstützt ein noinline
Pragma, das für die nächste Funktion gilt:
#pragma noinline
static void foo(void) { }
TI 6.0+ unterstützt ein
FUNC_CANNOT_INLINE
Pragma, das (ärgerlicherweise) in C und C ++ unterschiedlich funktioniert. In C ++ ähnelt es den ggA:
#pragma FUNC_CANNOT_INLINE;
static void foo(void) { }
In C ist jedoch der Funktionsname erforderlich:
#pragma FUNC_CANNOT_INLINE(foo);
static void foo(void) { }
Cray 6.4+ (und möglicherweise früher) verfolgt einen ähnlichen Ansatz und erfordert den Funktionsnamen:
#pragma _CRI inline_never foo
static void foo(void) { }
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:
static void foo(void);
#pragma no_inline(foo)
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:
#if \
HEDLEY_GNUC_HAS_ATTRIBUTE(noinline,4,0,0) || \
HEDLEY_INTEL_VERSION_CHECK(16,0,0) || \
HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \
HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
HEDLEY_IBM_VERSION_CHECK(10,1,0) || \
HEDLEY_TI_VERSION_CHECK(8,0,0) || \
(HEDLEY_TI_VERSION_CHECK(7,3,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__))
# define HEDLEY_NEVER_INLINE __attribute__((__noinline__))
#elif HEDLEY_MSVC_VERSION_CHECK(13,10,0)
# define HEDLEY_NEVER_INLINE __declspec(noinline)
#elif HEDLEY_PGI_VERSION_CHECK(10,2,0)
# define HEDLEY_NEVER_INLINE _Pragma("noinline")
#elif HEDLEY_TI_VERSION_CHECK(6,0,0)
# define HEDLEY_NEVER_INLINE _Pragma("FUNC_CANNOT_INLINE;")
#else
# define HEDLEY_NEVER_INLINE HEDLEY_INLINE
#endif
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.