LINUX.ORG.RU

В чем смысл макроса unlikely в коде kernel?


0

0

Это комментарий к нему:
/*
 * Generic compiler-dependent macros required for kernel
 * build go below this comment. Actual compiler/compiler version
 * specific implementations come from the above header files
 */
#define unlikely(x)	__builtin_expect(!!(x), 0)

Это означает проверку того, что передаваемая переменная равна 0 на этапе компиляции? И что означают !! ?
anonymous

Обычно likely/unlikely используются чтобы сообщить компилятору об
"вероятности" выполнения условия - эта информация используется
оптимизатором для генерации более качественного кода.
Например:

do_something1();

if (unlikely(something_wrong()))
        do_something2();

do_something3();

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

[asm for do_something1();]
[asm for something_wrong()]
[jnz label_2]
[asm for do_something3();]
[...]
label_2:
[asm for do_something2();]

т.е. наиболее вероятная ветка кода расположена _последовательно_.

P.S. если ты пишешь модуль - НЕ используй likely/unlikely!
Этим ты только снизишь читабельность кода. Эти макросы используются
в коде планировщика и в коде управления памятью - там где они 
действительно могут повысить производительность.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.