Мне кажется, что если у вас есть некоторые C++ код, как это:C++ Exception Throw/Поймать Оптимизации
int f()
{
try {
if(do_it() != success) {
throw do_it_failure();
}
} catch(const std::exception &e) {
show_error(e.what());
}
}
Компилятор Си ++ должен быть в состоянии оптимизировать бросок и поймать в почти простой Гото.
Тем не менее, мне кажется, что я разбираюсь в разборке и прохождении кода, что компиляторы всегда прыгать через очень грязные библиотеки обработки исключений.
Почему они это делают? Есть ли какое-то требование языка, которое предотвращает оптимизацию? Что делать, если это было:
int f()
{
try { throw std::runtime_error("Boo!"); }
catch (const std::exception &e) { std::cout << e.what() << std::endl; }
}
Почему компилятор не просто переписать, что, как
int f()
{
std::cout << "Boo!" << std::endl;
}
Возможно, потому что в C/C++ исключения не предназначены для управления потоком, а для фактических исключений и, следовательно, рассматриваются как несколько неприкосновенные с точки зрения реализации. – Amber
В последнем случае вы предполагаете, что std :: runtime_error() имеет конструктор и конструктор копирования, который не имеет побочных эффектов. Хотя это верно, компилятор может и не знать этого. –
@Martin: По крайней мере, конструкция _copy_ может быть легко удалена компиляторами. Вы не должны полагаться на создаваемые конструкторы. – sbi