NULL on error flipping bits whilst updating pixels

O if mais rápido do velho oeste

image

Provavelmente já deve ter se deparado com algum código semelhante a este, principalmente no kernel do Linux:

` if (unlikely(foo)) { …`

ou

` if (likely(bar)) { …`

E deve ter se perguntado o que seria esse likely/unlikely. Pesquisando mais a fundo vai descobrir que se trata de uma macro para dar uma dica ao processador que aquela condição tem mais chances de ser verdadeira ou falsa, permitindo assim ao processador já se antecipar e carregar os dados no cache da condição que tem mais probabilidade de estar correta.

O nome desse recurso é branch prediction e existe um excelente (e obrigatório) paper que fala sobre isso: What Every Programmer Should Know About Memory

No Qt também temos algo semelhante, conhecidos por Q_LIKELY e Q_UNLIKELY que fazem praticamente a mesma coisa.

Ambos os conjutos são definidos com uma macro, usando a função __builtin_expect, desta maneira:

#define likely(x)       __builtin_expect(!!(x), 1)
#define unlikely(x)     __builtin_expect(!!(x), 0)