Руководство по языку B.Pascal 7

         

Таблица динамических методов


Таблица виртуальных методов объектного типа содержит для каждого описанного в объектном типе виртуального метода и его предков четырехбайтовую запись. В тех случаях, когда в порождаю- щих типах (предках) определяется большее число виртуальных мето- дов, в процессе создания производных типов может использоваться достаточно большой объем памяти, особенно если создается много производных типов. Хотя в производных типах могут переопределять- ся только некоторые из наследуемых методов, таблица виртуальных методов каждого производного типа содержит указатели метода для всех наследуемых виртуальных методов, даже если они не изменя- лись.

Динамические методы обеспечивают в таких ситуациях альтерна- тиву. В Borland Pascal имеется формат таблицы методов и новый способ диспетчеризации методов с поздним связыванием. Вместо ко- дирования для всех методов объектного типа с поздним связыванием, в таблице динамических методов кодируются только те методы, кото- рые были в объектном типе переопределены. Если в наследующих ти- пах переопределяются только некоторые из большого числа методов с поздним связыванием, формат таблицы динамических методов исполь- зует меньшее пространство, чем формат таблицы виртуальных мето- дов.

Формат таблицы динамических методов иллюстрируют следующие два объектных типа:

type TBase = object X: Integer; constructor Init; destructor Done; virtual; procedure P10; virtual 10; procedure P20; virtual 20; procedure P30; virtual 30; procedure P30; virtual 30; end;

type TDerived = object(TBase) Y: Integer; constructor Init; destructor Done; virtual; procedure P10; virtual 10; procedure P30; virtual 30; procedure P50; virtual 50; end;

На Рис. 21.10 и 21.11 показаны схемы таблицы виртуальных ме- тодов и таблицы динамических методов для TBase и TDerived. Каждая ячейка соответствует слову памяти, а каждая большая ячейка - двум словам памяти.

ТВМ TBase ТДМ TBase ------------------- ------------------- ¦ 4 ¦ ¦ 0 ¦ +------------------+ +------------------+ ¦ -4 ¦ ¦ индекс в кэш ¦ +------------------+ +------------------+ ¦ Смещ. ТДМ TBase ¦ ¦ смещение записи ¦ +------------------+ +------------------+ ¦ 0 ¦ ¦ 4 ¦ +------------------+ +------------------+ ¦ ¦ ¦ 10 ¦ ¦ @TBase.Done ¦ +------------------+ ¦ ¦ ¦ 20 ¦ L------------------- +------------------+ ¦ 30 ¦ +------------------+ ¦ 40 ¦ +------------------+ ¦ ¦ ¦ @TBase.P10 ¦ ¦ ¦ +------------------+ ¦ ¦ ¦ @TBase.P20 ¦ ¦ ¦ +------------------+ ¦ ¦ ¦ @TBase.P30 ¦ ¦ ¦ +------------------+ ¦ ¦ ¦ @TBase.P40 ¦ ¦ ¦ L-------------------


Рис. 21. 10 Схемы таблицы виртуальных методов и таблицы дина- мических методов для TBase.
Объектный тип имеет таблицу динамических методов только в том случае, если в нем вводятся или переопределяются динамические методы. Если объектный тип наследует динамические методы, но они не переопределяются, и новые динамические методы не вводятся, то он просто наследует таблицу динамических методов своего предка.
Как и в случае таблицы виртуальных методов, таблица динами- ческих методов записывается в инициализированную часть сегмента данных прикладной программы.
ТВМ TDerived ТДМ TDerived -------------------- ------------------- ¦ 6 ¦ ¦ Смещ. ТДМ TBase ¦ +-------------------+ +------------------+ ¦ -6 ¦ ¦ индекс в кеше ¦ +-------------------+ +------------------+ ¦ Смещ. ТДМ TDerived¦ ¦ смещение записи ¦ +-------------------+ +------------------+ ¦ 0 ¦ ¦ 3 ¦ +-------------------+ +------------------+ ¦ ¦ ¦ 10 ¦ ¦ @TBase.Done ¦ +------------------+ ¦ ¦ ¦ 30 ¦ L-------------------- +------------------+ ¦ 50 ¦ +------------------+ ¦ ¦ ¦ @TDerived.P10 ¦ ¦ ¦ +------------------+ ¦ ¦ ¦ @TDerived.P30 ¦ ¦ ¦ +------------------+ ¦ ¦ ¦ @TDerived.T50 ¦ ¦ ¦ L-------------------
Рис. 21.11. Схемы таблицы виртуальных методов и таблицы ди- намических методов для TDerived.
Первое слово таблицы динамических методов содержит смещение сегмента данных родительской таблицы динамических методов, или 0, если родительская таблица динамических методов отсутствует.
Второе и третье слово таблицы динамических методов использу- ется в кеш-буфере просмотра динамических методов (см. далее).
Четвертое слово таблицы динамических методов содержит счет- чик записи таблицы динамических методов. Непосредственно за ним следует список слов, каждое из которых содержит индекс динамичес- кого метода, а затем список соответствующих указателей методов. Длина каждого списка задается счетчиком записи таблицы динамичес- ких методов.

Содержание раздела