Почему buildin_expect используется в long вместо bool?
Я просматривал руководство GCC http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html
У меня был следующий вопрос о builtin_expect
long __builtin_expect (long exp, long c)
Почему exp длинного типа, когда тип должен был быть bool?
Например: ядро определяет макрос для преобразования выражения в bool
определить вероятность (x) __builtin_expect(!!(x), 1)
Тогда почему бы не определить интерфейс, в котором exp - это bool, а не long?
1 ответ
__builtin_expect
возвращает значение exp
поэтому для согласованности он должен возвращать тот же тип, что и exp
, тоже.
Выбор long
(если это действительно так, и документация не просто отсутствует) вероятно историческая. То, что я ожидал бы от такой функции, это оставить выражение exp
полностью неизменным по типу и стоимости. Эта функция должна только "аннотировать" код с подсказкой для компилятора и не изменять семантику, если, например, тип exp
было бы unsigned long
,
Кстати, выражение !!(x)
в макросе ядра нет типа _Bool
но это int
и этот пример является просто частным случаем использования, где exp
только может иметь два результата. Сама функция более общая, чем эта.