Почему 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 только может иметь два результата. Сама функция более общая, чем эта.

Другие вопросы по тегам