Могут ли вероятные / маловероятные макросы использоваться в коде пользовательского пространства?

Я наткнулся на эти 2 макроса в коде ядра Linux. Я знаю, что это инструкции для компилятора (gcc) для оптимизации в случае ветвления. У меня вопрос, можем ли мы использовать эти макросы в коде пользовательского пространства? Это даст какую-то оптимизацию? Любой пример будет очень полезным.

3 ответа

Решение

Да, они могут. В ядре 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

Он определенно даст вам оптимизацию, если вы будете использовать его для правильных прогнозов ветвления.

Посмотрите, что каждый программист должен знать о памяти, в разделе "6.2.2 Оптимизация доступа к кэшу инструкций уровня 1" - здесь есть раздел именно об этом.

Макросы вероятности () и маловероятного () - это красивые имена, определенные в заголовках ядра для чего-то, что является реальной функцией gcc

Другие вопросы по тегам