Karena jawaban lain telah cukup disarankan, Anda dapat menggunakan __builtin_expect
untuk memberikan petunjuk kepada kompiler tentang bagaimana mengatur kode assembly. Seperti yang ditunjukkan oleh dokumen resmi , dalam banyak kasus, assembler yang terpasang di otak Anda tidak akan sebaik yang dibuat oleh tim GCC. Sebaiknya gunakan data profil aktual untuk mengoptimalkan kode Anda, daripada menebak-nebak.
Di sepanjang baris yang mirip, tetapi belum disebutkan, adalah cara khusus GCC untuk memaksa compiler membuat kode di jalur "cold". Ini melibatkan penggunaan atribut noinline
dan cold
, yang melakukan persis seperti yang mereka lakukan. Atribut ini hanya dapat diterapkan ke fungsi, tetapi dengan C ++ 11, Anda dapat mendeklarasikan fungsi lambda sebaris dan kedua atribut ini juga dapat diterapkan ke fungsi lambda.
Meskipun ini masih termasuk dalam kategori umum pengoptimalan mikro, dan dengan demikian saran standar berlaku — uji jangan menebak — saya rasa ini lebih berguna secara umum daripada __builtin_expect
. Hampir tidak ada generasi prosesor x86 yang menggunakan petunjuk prediksi cabang ( referensi ), jadi satu-satunya hal yang dapat Anda pengaruhi adalah urutan kode assembly. Karena Anda tahu apa itu penanganan kesalahan atau kode "kasus tepi", Anda dapat menggunakan anotasi ini untuk memastikan bahwa kompilator tidak akan pernah memprediksi cabangnya dan akan menautkannya dari kode "panas" saat mengoptimalkan ukuran.
Penggunaan sampel:
void FooTheBar(void* pFoo)
{
if (pFoo == nullptr)
{
// Oh no! A null pointer is an error, but maybe this is a public-facing
// function, so we have to be prepared for anything. Yet, we don't want
// the error-handling code to fill up the instruction cache, so we will
// force it out-of-line and onto a "cold" path.
[&]() __attribute__((noinline,cold)) {
HandleError(...);
}();
}
// Do normal stuff
⋮
}
Lebih baik lagi, GCC akan secara otomatis mengabaikan ini untuk mendukung umpan balik profil jika tersedia (misalnya, saat menyusun dengan -fprofile-use
).
Lihat dokumentasi resminya di sini: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes