Katakanlah saya memiliki fungsi kecil ini dalam file sumber
static void foo() {}
dan saya membangun versi optimal biner saya, tetapi saya tidak ingin fungsi ini diuraikan (untuk keperluan optimasi). apakah ada makro yang bisa saya tambahkan dalam kode sumber untuk mencegah inlining?
Jawaban:
Anda ingin atribut
gcc
-specificnoinline
.Gunakan seperti ini:
sumber
GCC memiliki saklar bernama
-fno-inline-small-functions
Jadi gunakan itu saat memanggil gcc. Tetapi efek sampingnya adalah semua fungsi kecil lainnya juga tidak inline.
sumber
-fno-inline
tidak berfungsi sama sekali.gdb
masih memasuki metode saat step-over. Ada yang rusak, dan saya ragugdb
.Cara portabel untuk melakukan ini adalah memanggil fungsi melalui pointer:
Meskipun ini menghasilkan instruksi yang berbeda untuk cabang, yang mungkin bukan tujuan Anda. Yang membawa titik yang baik: apa adalah tujuan Anda di sini?
sumber
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:__has_attribute(noinline)
)__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:PGI 10.2+ (dan mungkin lebih tua) mendukung
noinline
pragma yang berlaku untuk fungsi selanjutnya:TI 6.0+ mendukung
FUNC_CANNOT_INLINE
pragma yang (secara mengganggu) bekerja secara berbeda dalam C dan C ++. Dalam C ++, ini mirip dengan PGI:Namun dalam C, nama fungsi diperlukan:
Cray 6.4+ (dan mungkin sebelumnya) mengambil pendekatan yang serupa, membutuhkan nama fungsi:
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:
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:
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 ☺.
sumber
Jika Anda mendapatkan kesalahan kompiler
__attribute__((noinline))
, Anda bisa mencoba:sumber
Inilah yang bekerja untuk saya.
sumber
Gunakan
noinline
atribut :Anda mungkin harus menggunakannya baik ketika Anda mendeklarasikan fungsi untuk penggunaan eksternal dan ketika Anda menulis fungsi.
sumber
Saya bekerja dengan gcc 7.2. Saya secara khusus membutuhkan fungsi yang tidak di-inline, karena itu harus dipakai di perpustakaan. Saya mencoba
__attribute__((noinline))
jawabannya, jugaasm("")
jawabannya. Tidak ada yang memecahkan masalah.Akhirnya, saya pikir bahwa mendefinisikan variabel statis di dalam fungsi akan memaksa kompiler untuk mengalokasikan ruang untuknya di blok variabel statis, dan mengeluarkan inisialisasi untuk itu ketika fungsi pertama kali dipanggil.
Ini semacam trik kotor, tetapi berhasil.
sumber
inline void foo(void) { ... }
di header dan mendeklarasikannyaextern inline void foo(void);
dalam file sumber perpustakaan. Mengikuti semantik C99, kompiler akan diizinkan untuk sebaris fungsi ketika diinginkan DAN memancarkan kode objek di perpustakaan Anda. Lihat Apakah "inline" tanpa "statis" atau "eksternal" pernah berguna di C99? .