Могут ли вероятные / маловероятные макросы использоваться в коде пользовательского пространства?
Я наткнулся на эти 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