Eles são dicas de compilador para o GCC. Eles são usados em condicionais para dizer ao compilador se uma ramificação provavelmente será usada ou não. Ele pode ajudar o compilador a estabelecer o código de maneira ideal para o resultado mais frequente.
Eles são usados assim:
if (likely(some_condition)) {
// the compiler will try and make the code layout optimal for the case
// where some_condition is true, i.e. where this block is run
most_likely_action();
} else {
// this block is less frequently used
corner_case();
}
Ele deve ser usado com muito cuidado (isto é, com base nos resultados reais de criação de perfis de filiais). Uma dica errada pode degradar o desempenho (obviamente).
Alguns exemplos de como o código pode ser otimizado são encontrados facilmente pesquisando por GCC __builtin_expect
. Esta postagem do blog otimização do gcc: __builtin_expect , por exemplo, detalha uma desmontagem com ele.
O tipo de otimizações que podem ser feitas é muito específico do processador. A idéia geral é que, com freqüência, os processadores executam o código mais rapidamente se ele não se ramificar / pular por todo o lugar. Quanto mais linear for, e quanto mais previsíveis forem os ramos, mais rapidamente será executado. (Isso é especialmente verdadeiro para processadores com pipelines profundos, por exemplo).
Assim, o compilador emitirá o código de tal forma que a ramificação mais provável não envolverá um salto se é isso que a CPU alvo prefere, por exemplo.