Скорее всего, в ядре Linux есть макрос

У меня есть понимание того, как работают макросы вероятности ()/ маловероятного (), и у меня также есть понимание предсказания переходов. К сожалению, я не изучал предсказание ветвлений в контексте программирования высокого уровня.

Что я хочу знать, так это то, что оценка внутри вероятного / маловероятного макроса приводит к ошибке сегментации, как это влияет на историю предсказаний ветвлений или даже на текущий результат / конвейер.

Я не понимаю, что если проверка прогноза не завершилась, как мы узнаем, был ли это успех или неудача?

1 ответ

Решение

__builtin_expect(используется в определении вероятных / маловероятных макросов) не генерирует реальный код для оценки любого из его аргументов. Все, что он делает, это сообщает компилятору, какой результат ожидать, если он был оценен.

Оптимизатор может сбить с толку, если вы скажете, что*(int*)NULLобычно13, но (за исключением ошибок компилятора) он не будет вызывать ошибки компилятора или генерировать код, который вызывает ошибки во время выполнения.

Другой ответ на старый вопрос имеет фактическую asm с макросом или без него, показывая, что их эффект заключается в том, как gcc выкладывает код (например, исключая маловероятный случай, а вероятный случай - в непроходимой стороне) условной ветви, где ошибки кэша инструкций менее вероятны).


Это не совсем дубликат вероятных ()/ маловероятных () макросов в ядре Linux - как они работают? В чем их выгода?, но вы найдете гораздо больше информации о том, как работают эти макросы и как они влияют на эти вопросы и ответы.

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