logo
Программирование в среде Delphy / Программирование в среде Delphi

18.1. Выделение памяти под объект

Рассмотрим более детально – что собой представляет объект? Допустим, что мы определили класс следующим образом:

Type TMyClass=Class

F1:Integer;

F2:String[20];

Procedure Sm1;

Procedure Vm1;virtual;

Procedure Vm2;virtual;

` Procedure Dm1;dynamic;

Procedure Dm2;dynamic;

End;

В обработчике какого–то события в описании переменных определим указатель на объект класса TMyObject:

Var Obj1:TMyClass;

В разделе действий мы создадим экземпляр этого объекта как

Obj1:=TMyClass.Create;

На рис.18.1 показано, как будет выглядеть внутренняя структура этого объекта.

Рис.18.1. Структура связи объекта с описаним класса

Первое поле каждого экземпляра объекта содержит указатель на его класс. Затем идут поля объекта в том порядке, как они описаны в классе, и всех наследуемых классах. Класс как структура состоит из двух частей. Указатель на класс определяет начало таблицы указателей на динамические методы класса. В эту таблицу включаются все наследуемые и вновь описанные в данном классе динамические методы. Перед таблицей динамических методов с отрицательным смещением располагается информация о классе, так называемая информация о типе времени выполнения (RunTime Type Information – RTTI). Описание этой информации можно найти в модуле System.pas (см. константы с приставкой vmt*). От версии к версии Delphi объем этой информации все возрастает и, например, для Delphi 6 составляет 76 байт. В этой области находятся 19 указателей на различные таблицы и параметры класса. Так, например, там есть указатели на классовые методы, которые можно вызывать, даже не выделяя объекту память, есть указатели на таблицы динамических методов, таблицу реализуемых интерфейсов (для совместимости с объектами COM) и т.д. Но к этой таблице напрямую нужно обращаться только в крайнем случае и имея большой опыт программирования на Delphi. Все основные параметры класса можно получать, используя методы прародителя всех классов класса TObject.