Re[5]: Параметр this ?
От: Андрей Тарасевич Беларусь  
Дата: 23.04.02 15:51
Оценка:
Здравствуйте Кодт, Вы писали:

АТ>>P.S. Не думаю, что 'this' тут на что-то влияет.


К>В общем, именно this и повлиял.

К>Ну, и конвенция stdcall тоже.

Никак не могу въехать, где ты тут видишь влияние 'this' и конвенции 'stdcall'? Приведенный пример является классическим примером, демонстрирующим undefined behavior возникающий при попытке модифицировать одно и то же скалярное значение несколько раз между парой sequence points. Предсказать поведение этого кода невозможно ни с 'this' и 'stdcall', ни без них. Причем это не какой-нибудь теоретический undefined behavior, это самый настоящий практический undefined behavior, который всегда себя проявляет тем или иным образом. Этот (и аналогичные) пример может порождать разные результаты при компиляции отладочной или релизной версии, при включении/выключении оптимизаций и т.п.

Твой вариант, в котором ты заменил '++z' на вызовы функций 'z1', 'z2' и 'z3', не является эквивалентом исходного варианта. Здесь важно именно то, что изменение 'z' не заключено в функцию. Имено в этом случае мы получим множественную модификацию между парой sequence points.

Можно попытаться приллюстрировать проблему (хотя иллюстрировать undefined behavior — занятие неблагодарное). В ответ на

a.f( ++z,1 ).f( ++z,2 ).f( ++z,3 );


Компилятор имеет право сгенерировать и такой код:

int t1 = ++z;
int t2 = ++z;
int t3 = ++z;
a2 = a1.f1(t1, 1);
a3 = a1.f2(t2, 2);
a3.f3(t3, 3);


А также он имеет право сгенерировать такой код:

int t3 = ++z;
int t2 = ++z;
int t1 = ++z;
a2 = a1.f1(t1, 1);
a3 = a1.f2(t2, 2);
a4 = a3.f3(t3, 3);


Или такой:

int t1 = ++z;
a2 = a1.f1(t1, 1);
int t2 = ++z;
a3 = a1.f2(t2, 2);
int t3 = ++z;
a3.f3(t3, 3);


Во всех этих случаях результат будет разным. Это и есть ответ на исходный вопрос. Никакой 'this' или 'stdcall' тут соврешенно ни при чем.
Best regards,
Андрей Тарасевич
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.