Como todas as outras respostas sugeriram adequadamente, você pode usar __builtin_expect
para dar ao compilador uma dica sobre como organizar o código do assembly. Como os documentos oficiais apontam, na maioria dos casos, o montador embutido em seu cérebro não será tão bom quanto o criado pela equipe do GCC. É sempre melhor usar dados de perfil reais para otimizar seu código, em vez de adivinhar.
Ao longo de linhas semelhantes, mas ainda não mencionadas, é uma maneira específica do GCC para forçar o compilador a gerar código em um caminho "frio". Isso envolve o uso dos atributos noinline
e cold
, que fazem exatamente o que parecem que fazem. Esses atributos só podem ser aplicados a funções, mas com C ++ 11, você pode declarar funções lambda embutidas e esses dois atributos também podem ser aplicados a funções lambda.
Embora isso ainda se enquadre na categoria geral de micro-otimização e, portanto, o conselho padrão se aplica - teste, não adivinhe -, sinto que é mais útil do que geralmente __builtin_expect
. Quase nenhuma geração do processador x86 usa dicas de previsão de ramificação ( referência ), então a única coisa que você poderá afetar de qualquer maneira é a ordem do código de montagem. Como você sabe o que é código de manipulação de erros ou "caso extremo", pode usar esta anotação para garantir que o compilador nunca irá prever um branch para ele e irá vinculá-lo fora do código "quente" ao otimizar o tamanho.
Uso de amostra:
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
⋮
}
Melhor ainda, o GCC irá ignorar isso automaticamente em favor do feedback do perfil quando estiver disponível (por exemplo, ao compilar com -fprofile-use
).
Veja a documentação oficial aqui: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes