Re: throw и количество создаваемых объектов
От: shank  
Дата: 11.10.06 11:40
Оценка: 2 (1)
Здравствуйте, JohnDoe, Вы писали:

JD>Получаем

dtor
JD>dtor

Т.е. был создано 2 экземпляра a_t.


JD>Если же раскоментарить дефолтный и копирующий конструкторы, то получим только один вызов деструктора, т.е. был создан всего один объект. Насколько я понимаю, при отсутсвии определенного дефолтного и копирующего конструкторов компилятор должен был создать их сам и количество созданных объектов должно было равняться 1 в обоих случаях. Или оптимизация при выбросе исключений зависит от реализации оной компилятором?

Да, это зависит от реализации, gcc например в обоих случаях создает 1 временный объект.

JD>Есть ли гарантии на количество создаваемых временных объектов при выбросе исключения?

JD>VC++2002, VC++2005
При выбрасывании исключения реализация (сама) может создать только один временный объект, которым впоследствии инициализируется catch-обработчик.
Если это не повлияет на логику программы (кроме лишних вызовов конструторов/деструкторов), этот временный объект разрешено не создавать, а инициализировать обработчик напрямую аргументом throw-выражения:

If the use of the temporary object can be eliminated without changing the meaning of the program except for the
execution of constructors and destructors associated with the use of the temporary object (12.2), then the exception in
the handler can be initialized directly with the argument of the throw expression.

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.