'm_counter' есть DWORD-член класса MyClass; MyClass2 — некий класс с деструктором; остальное не важно.
ВОПРОС: гарантируется ли что деструктор объекта 'MyClass2 obj' вызовется ДО выполнения '--m_counter'? Не передвинет ли оптимизатор вызов деструктора на момент ПОСЛЕ '--m_counter' — вдруг он просто уберёт блок '{...}', окружающий 'MyClass2 obj' как 'ненужный'? С этими оптимизаторами ни в чём нельяз быть уверенным :-(
Glen
Re: Не передвинет ли оптимизатор вызов деструктора
Здравствуйте, Glenn, Вы писали:
G>ВОПРОС: гарантируется ли что деструктор объекта 'MyClass2 obj' вызовется ДО выполнения '--m_counter'? Не передвинет ли оптимизатор вызов деструктора на момент ПОСЛЕ '--m_counter' — вдруг он просто уберёт блок '{...}', окружающий 'MyClass2 obj' как 'ненужный'? С этими оптимизаторами ни в чём нельяз быть уверенным
Оптимизатор волен делать что угодно, но при этом он оставит видимое поведение программы таким, как будто деструктор вызывается до декремента.
G> { G> MyClass2 obj; G> ... G> } G> --m_counter;
G>ВОПРОС: гарантируется ли что деструктор объекта 'MyClass2 obj' вызовется ДО выполнения '--m_counter'? Не передвинет ли оптимизатор вызов деструктора на момент ПОСЛЕ '--m_counter' — вдруг он просто уберёт блок '{...}', окружающий 'MyClass2 obj' как 'ненужный'? С этими оптимизаторами ни в чём нельяз быть уверенным
все должно произойти так, как будто порядок правильный. Если от этого порядка что-то зависит, то все будет так как нужно.
Re: Не передвинет ли оптимизатор вызов деструктора
Здравствуйте, Glenn, Вы писали:
G>Компилятор: MS Visual C++ G>Код:
G>void MyClass::MyMethod() G>{ G> ... G> { G> MyClass2 obj; G> ... G> } G> --m_counter; G>}
G>'m_counter' есть DWORD-член класса MyClass; MyClass2 — некий класс с деструктором; остальное не важно.
G>ВОПРОС: гарантируется ли что деструктор объекта 'MyClass2 obj' вызовется ДО выполнения '--m_counter'? Не передвинет ли оптимизатор вызов деструктора на момент ПОСЛЕ '--m_counter' — вдруг он просто уберёт блок '{...}', окружающий 'MyClass2 obj' как 'ненужный'? С этими оптимизаторами ни в чём нельяз быть уверенным
Если это простой блок — гарантируется, а если это часть логического условия с лямбдой — нет.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[2]: Не передвинет ли оптимизатор вызов деструктора
Здравствуйте, Glenn, Вы писали:
G>Компилятор: MS Visual C++ G>Код:
G>void MyClass::MyMethod() G>{ G> ... G> { G> MyClass2 obj; G> ... G> } G> --m_counter; G>}
G>'m_counter' есть DWORD-член класса MyClass; MyClass2 — некий класс с деструктором; остальное не важно.
G>ВОПРОС: гарантируется ли что деструктор объекта 'MyClass2 obj' вызовется ДО выполнения '--m_counter'? Не передвинет ли оптимизатор вызов деструктора на момент ПОСЛЕ '--m_counter' — вдруг он просто уберёт блок '{...}', окружающий 'MyClass2 obj' как 'ненужный'? С этими оптимизаторами ни в чём нельяз быть уверенным
Компилятор должен гарантировать уничтожение автоматической переменной при выходе из области видимости.
MS VC++ делает это точно.
Мне кажется
MyClass2 obj = NULL;
try
{
obj = new MyClass2();
}
catch(...//тут свое){}
delete obj;
так будет элегантнее
Re[2]: Не передвинет ли оптимизатор вызов деструктора
Здравствуйте, morm, Вы писали:
M>Здравствуйте, Glenn, Вы писали:
G>>Компилятор: MS Visual C++ G>>Код:
G>>void MyClass::MyMethod() G>>{ G>> ... G>> { G>> MyClass2 obj; G>> ... G>> } G>> --m_counter; G>>}
G>>'m_counter' есть DWORD-член класса MyClass; MyClass2 — некий класс с деструктором; остальное не важно.
G>>ВОПРОС: гарантируется ли что деструктор объекта 'MyClass2 obj' вызовется ДО выполнения '--m_counter'? Не передвинет ли оптимизатор вызов деструктора на момент ПОСЛЕ '--m_counter' — вдруг он просто уберёт блок '{...}', окружающий 'MyClass2 obj' как 'ненужный'? С этими оптимизаторами ни в чём нельяз быть уверенным
M>Компилятор должен гарантировать уничтожение автоматической переменной при выходе из области видимости. M>MS VC++ делает это точно.
M>Мне кажется M>MyClass2 obj = NULL; M>try M>{ M> obj = new MyClass2(); ...//конечно M>} M>catch(...//тут свое){} M>delete obj;
M>так будет элегантнее
Re[3]: Не передвинет ли оптимизатор вызов деструктора
Перечитайте повнимательнее свой код, особенно объявление автоматической переменной, присвоение ей указателя, catch(...) без throw
Хотя это гавно просто не скомпилируется.
Про элегантность — нормальный такой вброс.
У ТС был нормальный рабочий код.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re: Не передвинет ли оптимизатор вызов деструктора
Здравствуйте, Glenn, Вы писали:
G>Компилятор: MS Visual C++ G>Код:
G>void MyClass::MyMethod() G>{ G> ... G> { G> MyClass2 obj; G> ... G> } G> --m_counter; G>}
G>'m_counter' есть DWORD-член класса MyClass; MyClass2 — некий класс с деструктором; остальное не важно.
G>ВОПРОС: гарантируется ли что деструктор объекта 'MyClass2 obj' вызовется ДО выполнения '--m_counter'? Не передвинет ли оптимизатор вызов деструктора на момент ПОСЛЕ '--m_counter' — вдруг он просто уберёт блок '{...}', окружающий 'MyClass2 obj' как 'ненужный'? С этими оптимизаторами ни в чём нельяз быть уверенным
Оптимизатор — нет. Современные суперскалярные процессоры могут. Гуглите memory barrier.
Здравствуйте, пыщьх, Вы писали:
П>Оптимизатор — нет. Современные суперскалярные процессоры могут. Гуглите memory barrier.
Конечно же такого быть не может, не надо пугать людей.
Любой процессор обеспечивает само-консистентность независимо от того как он работает. Т.е. он работает грубо говоря так же как и оптимизирующий С компилятор — в реальности может быть что угодно, но видимое поведение не меняется (много-ядерные/процессорные системы пока оставим в стороне).