Вот то, что мы пытаемся сделатьпопытка {....} задвижка (..) только если определенное выражение во время компиляции верно
try {
std::uninitialized_copy(...);
} catch(...) {
if(!boost::has_trivial_destructor<T>::value) {
// some cleanup to do here...
}
throw;
}
Мы задаемся вопросом, имеет ли попробовать/поймать стоимость, если константа времени компиляции в if
является ложной.
Может ли компилятор в пределах своих прав «как-бы» удалить попытку улова и вести себя как-будто вызов std::uninitialized_copy
появился без try
вокруг него?
Или есть что-то скрытое в спецификациях C++, которое требует, чтобы компилятор оставил его здесь? В качестве примера предположим гипотетическую функцию surrounding_try_blocks()
, которая возвращает динамические окружающие числа проб, отсчитываемых в настоящее время вокруг кадра.
Не могли бы вы разработать свой question.Like, когда вы говорите, «действительно попытаться/поймать имеет стоимость «Какую цену вы имели в виду. Простое размещение блоков try/catch имеет некоторую производительность. – ravi
Если я понимаю вопрос, это: if 'boost :: ...'истинно, тогда код можно было бы оптимизировать только до вызова' unitialized_copy', так как все, что он делает, улавливает исключение, а затем снова бросает его. Но компилятор разрешил эту оптимизацию? – Tommy
, если компилятор оптимизирует оператор if, ваша программа функционирует точно так же, как и без блоков try/catch, нет? Таким образом, я не вижу, что надстройка для компилятора должна быть оптимизирована. –