Скорее всего, в ядре Linux есть макрос
У меня есть понимание того, как работают макросы вероятности ()/ маловероятного (), и у меня также есть понимание предсказания переходов. К сожалению, я не изучал предсказание ветвлений в контексте программирования высокого уровня.
Что я хочу знать, так это то, что оценка внутри вероятного / маловероятного макроса приводит к ошибке сегментации, как это влияет на историю предсказаний ветвлений или даже на текущий результат / конвейер.
Я не понимаю, что если проверка прогноза не завершилась, как мы узнаем, был ли это успех или неудача?
1 ответ
__builtin_expect
(используется в определении вероятных / маловероятных макросов) не генерирует реальный код для оценки любого из его аргументов. Все, что он делает, это сообщает компилятору, какой результат ожидать, если он был оценен.
Оптимизатор может сбить с толку, если вы скажете, что*(int*)NULL
обычно13
, но (за исключением ошибок компилятора) он не будет вызывать ошибки компилятора или генерировать код, который вызывает ошибки во время выполнения.
Другой ответ на старый вопрос имеет фактическую asm с макросом или без него, показывая, что их эффект заключается в том, как gcc выкладывает код (например, исключая маловероятный случай, а вероятный случай - в непроходимой стороне) условной ветви, где ошибки кэша инструкций менее вероятны).
Это не совсем дубликат вероятных ()/ маловероятных () макросов в ядре Linux - как они работают? В чем их выгода?, но вы найдете гораздо больше информации о том, как работают эти макросы и как они влияют на эти вопросы и ответы.