Re: Не передвинет ли оптимизатор вызов деструктора
От: remark Россия http://www.1024cores.net/
Дата: 08.07.10 16:42
Оценка: 1 (1) +1
Здравствуйте, Glenn, Вы писали:

G>ВОПРОС: гарантируется ли что деструктор объекта 'MyClass2 obj' вызовется ДО выполнения '--m_counter'? Не передвинет ли оптимизатор вызов деструктора на момент ПОСЛЕ '--m_counter' — вдруг он просто уберёт блок '{...}', окружающий 'MyClass2 obj' как 'ненужный'? С этими оптимизаторами ни в чём нельяз быть уверенным


Оптимизатор волен делать что угодно, но при этом он оставит видимое поведение программы таким, как будто деструктор вызывается до декремента.


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Не передвинет ли оптимизатор вызов деструктора
От: Glenn  
Дата: 08.07.10 16:37
Оценка:
Компилятор: MS Visual C++
Код:

void MyClass::MyMethod()
{
...
{
MyClass2 obj;
...
}
--m_counter;
}

'm_counter' есть DWORD-член класса MyClass; MyClass2 — некий класс с деструктором; остальное не важно.

ВОПРОС: гарантируется ли что деструктор объекта 'MyClass2 obj' вызовется ДО выполнения '--m_counter'? Не передвинет ли оптимизатор вызов деструктора на момент ПОСЛЕ '--m_counter' — вдруг он просто уберёт блок '{...}', окружающий 'MyClass2 obj' как 'ненужный'? С этими оптимизаторами ни в чём нельяз быть уверенным :-(
Glen
Re: Не передвинет ли оптимизатор вызов деструктора
От: dilmah США  
Дата: 08.07.10 16:48
Оценка:
G> {
G> MyClass2 obj;
G> ...
G> }
G> --m_counter;

G>ВОПРОС: гарантируется ли что деструктор объекта 'MyClass2 obj' вызовется ДО выполнения '--m_counter'? Не передвинет ли оптимизатор вызов деструктора на момент ПОСЛЕ '--m_counter' — вдруг он просто уберёт блок '{...}', окружающий 'MyClass2 obj' как 'ненужный'? С этими оптимизаторами ни в чём нельяз быть уверенным


все должно произойти так, как будто порядок правильный. Если от этого порядка что-то зависит, то все будет так как нужно.
Re: Не передвинет ли оптимизатор вызов деструктора
От: Ops Россия  
Дата: 08.07.10 16:57
Оценка:
Здравствуйте, 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]: Не передвинет ли оптимизатор вызов деструктора
От: Ops Россия  
Дата: 08.07.10 17:03
Оценка:
И без лямбды тоже (ступил). Но в этом случае блок просто не будет выполняться, так что не будет ни деструктора, ни конструктора.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re: Не передвинет ли оптимизатор вызов деструктора
От: morm Россия  
Дата: 08.07.10 20:55
Оценка:
Здравствуйте, 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 Россия  
Дата: 08.07.10 21:01
Оценка:
Здравствуйте, 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]: Не передвинет ли оптимизатор вызов деструктора
От: Ops Россия  
Дата: 09.07.10 01:05
Оценка:
Перечитайте повнимательнее свой код, особенно объявление автоматической переменной, присвоение ей указателя, catch(...) без throw
Хотя это гавно просто не скомпилируется.
Про элегантность — нормальный такой вброс.
У ТС был нормальный рабочий код.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re: Не передвинет ли оптимизатор вызов деструктора
От: пыщьх http://rsdn_user.livejournal.com
Дата: 10.07.10 11:20
Оценка:
Здравствуйте, 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.
Запретное обсуждение модерирования RSDN:
http://rsdn-user.livejournal.com/652.html
Re[2]: Не передвинет ли оптимизатор вызов деструктора
От: remark Россия http://www.1024cores.net/
Дата: 11.07.10 20:14
Оценка:
Здравствуйте, пыщьх, Вы писали:

П>Оптимизатор — нет. Современные суперскалярные процессоры могут. Гуглите memory barrier.


Конечно же такого быть не может, не надо пугать людей.
Любой процессор обеспечивает само-консистентность независимо от того как он работает. Т.е. он работает грубо говоря так же как и оптимизирующий С компилятор — в реальности может быть что угодно, но видимое поведение не меняется (много-ядерные/процессорные системы пока оставим в стороне).


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.