Технически правильный ответ, но очень вводит в заблуждение.
В основе проблемы лежит наблюдение о том, что исключения являются исключительными. Их обычно не бывает. Это не тот случай, когда вы возвращаете код ошибки. Это происходит всегда, даже если ошибок нет. В этом случае функция по-прежнему должна возвращать 0
, или true
, или -1
, или ...
Теперь это означает, что ЦП и компилятор могут специально оптимизировать функции, которые не выполняются по исключению. Но важно понять , что они оптимизируют, и это безотказный, не исключительный случай - за счет исключительных случаев.
Как только мы это поймем, мы сможем посмотреть, как компилятор и ЦП оптимизируют такие случаи. Одним из распространенных методов является помещение кода исключения отдельно от обычного кода. В результате этот код обычно не попадает в кэш ЦП, который может содержать более полезный код. Фактически, код исключения может вообще не оказаться в ОЗУ и остаться на диске.
Другим вспомогательным механизмом является предсказатель ветвления ЦП. Он будет помнить, что ветви, которые приводят к коду исключения, обычно не берутся, и поэтому предсказывают, что в следующий раз они также не будут приняты. Компилятор может даже вставить это как подсказку. Тем не менее, эта функция подсказки была оставлена после Intel Pentium 4; современные процессоры достаточно хорошо предсказывают переходы.