Я столкнулся с этими двумя макросами в коде ядра Linux. Я знаю, что они являются инструкциями для компилятора (gcc) для оптимизации в случае ветвления. Мой вопрос: можем ли мы использовать эти макросы в коде пространства пользователя? Будет ли она оптимизировать? Любой пример будет очень полезен.
Могут ли вероятные/маловероятные макросы использоваться в коде пользовательского пространства?
Ответ 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
Это, безусловно, даст вам оптимизацию, если вы используете его для правильных предсказаний ветвления.
Ответ 2
Взгляните на Что каждый программист должен знать о памяти в разделе "6.2.2 Оптимизация доступа к кэшу уровня 1" - есть раздел о именно это.
Ответ 3
Вероятные() и маловероятные() макросы - это красивые имена, определенные в заголовках ядра для чего-то реального gcc-функции