Saya tahu pertanyaannya adalah tentang GCC, tapi saya pikir mungkin berguna untuk memiliki beberapa informasi tentang kompiler kompiler lain juga.
noinline
Atribut fungsi GCC
juga cukup populer dengan kompiler lain. Setidaknya didukung oleh:
- Dentang (periksa dengan
__has_attribute(noinline)
)
- Intel C / C ++ Compiler (dokumentasinya mengerikan, tapi saya yakin ini bekerja pada 16.0+)
- Oracle Solaris Studio kembali ke setidaknya 12.2
- ARM C / C ++ Compiler kembali ke setidaknya 4.1
- IBM XL C / C ++ kembali ke setidaknya 10.1
- TI 8.0+ (atau 7.3+ dengan --gcc, yang akan ditentukan
__TI_GNU_ATTRIBUTE_SUPPORT__
)
Selain itu, MSVC mendukung
__declspec(noinline)
kembali ke Visual Studio 7.1. Intel mungkin mendukungnya juga (mereka mencoba untuk kompatibel dengan GCC dan MSVC), tetapi saya belum repot-repot memverifikasi itu. Sintaks dasarnya sama:
__declspec(noinline)
static void foo(void) { }
PGI 10.2+ (dan mungkin lebih tua) mendukung noinline
pragma yang berlaku untuk fungsi selanjutnya:
#pragma noinline
static void foo(void) { }
TI 6.0+ mendukung
FUNC_CANNOT_INLINE
pragma yang (secara mengganggu) bekerja secara berbeda dalam C dan C ++. Dalam C ++, ini mirip dengan PGI:
#pragma FUNC_CANNOT_INLINE;
static void foo(void) { }
Namun dalam C, nama fungsi diperlukan:
#pragma FUNC_CANNOT_INLINE(foo);
static void foo(void) { }
Cray 6.4+ (dan mungkin sebelumnya) mengambil pendekatan yang serupa, membutuhkan nama fungsi:
#pragma _CRI inline_never foo
static void foo(void) { }
Oracle Developer Studio juga mendukung pragma yang mengambil nama fungsi, kembali ke setidaknya Forte Developer 6 , tetapi perhatikan bahwa itu harus datang setelah deklarasi, bahkan dalam versi terbaru:
static void foo(void);
#pragma no_inline(foo)
Tergantung pada seberapa berdedikasi Anda, Anda bisa membuat makro yang akan bekerja di mana-mana, tetapi Anda harus memiliki nama fungsi serta deklarasi sebagai argumen.
Jika, OTOH, Anda baik-baik saja dengan sesuatu yang hanya berfungsi untuk kebanyakan orang, Anda bisa lolos dengan sesuatu yang sedikit lebih estetis dan tidak perlu mengulangi sendiri. Itulah pendekatan yang saya ambil untuk Hedley , tempat versi
HEDLEY_NEVER_INLINE saat ini
terlihat seperti:
#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
Jika Anda tidak ingin menggunakan Hedley (ini adalah header domain / CC0 publik tunggal) Anda dapat mengonversi versi memeriksa makro tanpa terlalu banyak usaha, tetapi lebih dari yang saya bersedia ☺.