Подход с нулевой стоимостью можно использовать только в том случае, если он доступен для используемой цели. Если возможно, он используется большинством компиляторов C ++ производственного качества. В противном случае компилятор будет использовать setjmp/longjmp
подход.
Скорость выполнения setjmp/longjmp
ниже.
Однако даже при использовании подхода setjmp/longjmp
использование механизма исключений может привести к более высокой производительности, чем проверка кода возврата каждой функции, как в примере с оптимизацией с двумя циклами в вопросе.
Единственный способ выяснить, поддерживает ли target подход с нулевой стоимостью и используется ли он компилятором, - это преобразовать код C ++ в сборку и проанализировать его. Другим решением может быть вызов gnat
с --RTS=zcx
и проверка на наличие ошибок, если gnat
доступен. Но это не гарантирует, что он будет использоваться компилятором C ++.
Таким образом, в общем, если размер программы не имеет значения и доступны исключения с нулевой стоимостью, использование исключений для обработки непредвиденных ситуаций намного лучше, чем проверка кода возврата каждой функции. В противном случае исключения могут использоваться для оптимизации кода в определенных случаях.
Используйте, но не злоупотребляйте!
П.С .: Я закончил тем, что написал статью об этом.