Re[4]: Параметр this ?
От: Кодт Россия  
Дата: 23.04.02 06:58
Оценка: 4 (1)
Здравствуйте ALL

Я могу объяснить.
Итак, допустим, что используется конвенция stdcall

Перепишем выражение...

a1.f1(z1(), 1).f2(z2(), 2).f3(z3(), 3)
-- для наглядности переименовал ++z и f

a2 = f1(z1(), 1)
a3 = f2(z2(), 2)
a4 = f3(z3(), 3)

а теперь - будем хранить временные значения (а2, а3) на стеке

команда                       стек
===============+==================
push 3         |                 3
push & call z3 |              z3 3
pubh 2         |            2 z3 3
push & call z2 |         z2 2 z3 3
push 1         |       1 z2 2 z3 3
push & call z1 |    z1 1 z2 2 z3 3
push a1        | a1 z1 1 z2 2 z3 3 -- наконец-то! можем положить a
call f1        |      a2 z2 2 z3 3
call f2        |           a3 z3 3
call f3        |                a4


Вот так вот, любители cin/cout!

Для паскаля, кстати, (где другая конвенция), все не так ужасно
push a1        | a1
push & call z1 | z1 a1
push 1         | 1 z1 a1
call f1        | a2
push & cll z2  | z2 a2
push 2         | 2 z2 a2
call f2        | a3

etc...


Если бы компилятор думал своей головой и создал временную локальную переменную, то можно было бы и stdcall соблюсти:
mov temp, a1   |         | a1
push & call z1 |      z1 | a1
push 1         |    1 z1 | a1
push temp      | a1 1 z1 | a1
call f1        |      a2 | a1
pop temp       |         | a2

etc...


Но для дебага жизнь кажется более простой, у него есть дерево выражения, которое надо перевести в операции push и call
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.