1. Заголовок или название темы должно быть информативным ! 2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code]. 3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК ! 4.НЕ используйте форум для личного общения! 5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!
Объект TObject занимает в памяти 8 байт - сума двух longint, т.е. места для методов не резервируется. Мне интересно, как и где в памяти размещаются методы объектов и куда я обращаюсь, вызывая метод по ссылке - po^.method?
type PTobject=^TObject; TObject=object i,i2:longint; procedure method; end; procedure TObject.method; begin i:=4; end; var mem:longint; po:PTobject; p:pointer; pi:^longint; begin mem:=memavail; new(po); po^.method;{!!!!!!!!!!!!!!!!!!сдесь} p:=po; pi:=p; writeln(pi^); writeln('Difference: ',mem-memavail); readln; end.
--------------------
Лао-Цзы : Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
А как же... Конечно известно... Ты никогда не задумывался, почему происходит, например, такая вещь:
type T = object procedure A; procedure B; end;
procedure T.B; begin A; { <--- Почему ЗДЕСЬ компилятор тебе не говорит ничего о НЕописанной процедуре? } end; ...
А потому, что это - Forward declaration, и уже после объявления типа T компилятор знает, где будут располагаться все его методы, ибо количество методов ему известно, параметры известны... Что еще ему надо?
А вызвать метод объекта не описав его тип у тебя не получится по любому, синтаксис языка это запрещает... Поэтому Паскаль, кстати, так быстро компилирует - за один проход... В отличие от С/С++, которые работают за 3-4 прохода...
Цитата
Подставляет куда?
Вместо вызова obj.A; в генерируемый код подставляется CALL {адрес_метода} (ну, в смысле, опкод этого выражения)...