Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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

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

Ответ 3

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