Ответ 1
Да, они могут. В ядре Linux они определены как
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
Макросы __builtin_expect представляют собой специфичные для GCC макросы, которые используют предсказание ветвления; они сообщают процессору, может ли условие быть истинным, чтобы процессор мог предварительно набирать инструкции на правильной "стороне" ветки.
Вы должны обернуть определения в ifdef, чтобы обеспечить компиляцию других компиляторов:
#ifdef __GNUC__
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
#else
#define likely(x) (x)
#define unlikely(x) (x)
#endif
Это, безусловно, даст вам оптимизацию, если вы используете его для правильных предсказаний ветвления.