Visual С++ имеет параметр компилятора "Включить исключения С++", который может быть установлен на "Нет". Что именно произойдет, если я это установлю? Мой код никогда явно не бросает или не ловит исключения (и, следовательно, первое исключенное исключение закончит программу в любом случае) и не полагается на стирание стека - следует ли ожидать от нежелательной реакции от перекомпилированной программы?
Что именно произойдет, если я отключу исключения С++ в проекте?
Ответ 1
документация MSDN настройки объясняет разные режимы исключений и даже дает примеры кода, чтобы показать разницу между различными режимами. Кроме того, эта статья может быть интересной, хотя она довольно старой.
Нижняя строка: опция в основном включает или отключает отслеживание жизненных циклов всех ваших объектов. Такое отслеживание требуется, потому что в случае исключения все необходимые деструкторы должны быть вызваны, стек должен быть отключен, и выполняется большая очистка. Для такого отслеживания требуются организационные накладные расходы (= дополнительный код) - это можно отбросить, установив опцию "Нет".
Я не пробовал самостоятельно, но похоже, что вы все еще можете использовать исключения throw
и catch
, если для параметра установлено значение "Нет", но отсутствует очистка и разматывание, что может быть очень плохо последствия (не рекомендуется).
Ответ 2
Компилятор опустит деструкторы и другой код разворачивания стека, который очистится после объектов С++, когда они выйдут из области действия в результате исключения.
Другими словами, он не содержит кучу кода очистки. Этот значительно улучшит производительность, но также приведет к серьезному злу, если на самом деле возникает исключение. (Пора сам, если ты мне не веришь.)
Разница в производительности не является основанием для отключения исключений, за исключением некоторых критических приложений, где вы будете абсолютно обязаны это делать.
Ответ 3
Когда вы укажете "НЕТ" на "Включить исключения С++", тогда не будет выбрана синхронная модель обработки исключений Компилятора (/GX или /EHsc ). В этом режиме размытие семантики не будет включено. То есть объект с автоматическим хранением в кадре, между функцией, выполняющей бросок, и функцией, захватывающей бросок, не будет уничтожен.
Для получения дополнительной информации об обработке исключений можно обратиться к MSDN или Часто задаваемые вопросы об исключении Visual С++.
class Test
{
public:
Test()
{
printf("Test::constructor");
}
~Test()
{
printf("Test::Destructor");
}
};
int _tmain(int argc, _TCHAR* argv[])
{
int a;
try
{
Test a;
int* p = 0;
*p = 0; // Cause access violation
}
catch (...)
{
printf("Caught access violation");
}
return 0;
}
с обработкой No для обработки исключений:
Test::constructor
Caught access violation
Ответ 4
У вас по-прежнему будет доступ к управлению структурированными исключениями (SEH), который может обрабатываться __try, __except и __finally.
Обработка исключений С++ - это просто реализация класса, построенная поверх SEH.
Компилятор также будет жаловаться, если вы попытаетесь создать экземпляр классов в функции, которая имеет обработчик исключений SEH (жалуется на объекты, требующие разматывания, т.е. классы), которые могут быть немного грязными, но есть способы обойти это.
Ответ 5
Код, с которым я работал, всегда отключает исключения. Я не видел проблем с повреждением или сбоем ресурсов.
Я думал, что исключения, как правило, плохо подходят для С++. Разрушение стека, особенно с отсутствием GC, делает все исключения болью. И тогда дебаты о том, что "исключительный" действительно означает по сравнению с просто возможностями неудач.
Ответ 6
Что касается стандартного С++, вы получите поведение undefined. Стандарт С++ не допускает возможности исключения исключений в глобальном масштабе, а определенные операции со стандартной библиотекой определяются как бросание исключений при определенных обстоятельствах.
Ответ 7
Если operator new
не удается выделить память, я верю, что она вернет NULL
вместо того, чтобы бросать исключение std::bad_alloc
.
Если вы делаете какие-либо вызовы сторонним библиотекам, которые генерируют исключения, это приведет к большому сбою.