Diğer cevapların yeterince önerildiği gibi, __builtin_expect
derleyiciye montaj kodunu nasıl düzenleyeceğiniz konusunda bir ipucu vermek için kullanabilirsiniz . As resmi dokümanlar işaret çoğu durumda, beyninize yerleştirilen montajcı, GCC ekibi tarafından hazırlanmış olan kadar iyi olmayacaktır. Kodunuzu optimize etmek için tahmin etmek yerine gerçek profil verilerini kullanmak her zaman en iyisidir.
Benzer satırlar boyunca, ancak henüz bahsedilmemiştir, derleyiciyi "soğuk" bir yolda kod oluşturmaya zorlamanın GCC'ye özgü bir yoludur. Bu, kulağa tam olarak yaptıkları gibi yapan noinline
ve cold
özelliklerinin kullanımını içerir . Bu nitelikler yalnızca işlevlere uygulanabilir, ancak C ++ 11 ile satır içi lambda işlevlerini bildirebilirsiniz ve bu iki özellik lambda işlevlerine de uygulanabilir.
Her ne kadar bu, mikro optimizasyonun genel kategorisine girse de ve bu nedenle standart tavsiye geçerlidir - test tahmin etmeyin - daha genel olarak yararlı olduğunu düşünüyorum __builtin_expect
. X86 işlemcisinin neredeyse hiçbir nesli, dal tahmin ipuçlarını ( referans ) kullanmaz, bu nedenle her durumda etkileyebileceğiniz tek şey, montaj kodunun sırasıdır. Hata işlemenin veya "uç durum" kodunun ne olduğunu bildiğinizden, bu açıklamayı derleyicinin ona bir dalı asla tahmin etmemesini ve boyut için optimize ederken onu "etkin" koddan uzaklaştırmasını sağlamak için kullanabilirsiniz.
Örnek kullanım:
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
⋮
}
Daha da iyisi, GCC, mevcut olduğunda profil geri bildirimi lehine bunu otomatik olarak yok sayacaktır (örneğin, ile derleme yaparken -fprofile-use
).
Resmi belgelere buradan bakın: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes