Таблица виртуальных методов объектного типа содержит для
каждого описанного в объектном типе виртуального метода и его
предков четырехбайтовую запись. В тех случаях, когда в порождаю-
щих типах (предках) определяется большее число виртуальных мето-
дов, в процессе создания производных типов может использоваться
достаточно большой объем памяти, особенно если создается много
производных типов. Хотя в производных типах могут переопределять-
ся только некоторые из наследуемых методов, таблица виртуальных
методов каждого производного типа содержит указатели метода для
всех наследуемых виртуальных методов, даже если они не изменя-
лись.
Динамические методы обеспечивают в таких ситуациях альтерна-
тиву. В 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 │
└──────────────────┘ ├──────────────────┤
│ 30 │
├──────────────────┤
│ 40 │
├──────────────────┤
│ │
│ @TBase.P10 │
│ │
├──────────────────┤
│ │
│ @TBase.P20 │
│ │
├──────────────────┤
│ │
│ @TBase.P30 │
│ │
├──────────────────┤
│ │
│ @TBase.P40 │
│ │
└──────────────────┘
Рис. 21.10 Схемы таблицы виртуальных методов и таблицы дина-
мических методов для TBase.
Объектный тип имеет таблицу динамических методов только в
том случае, если в нем вводятся или переопределяются динамические
методы. Если объектный тип наследует динамические методы, но они
не переопределяются, и новые динамические методы не вводятся, то
он просто наследует таблицу динамических методов своего предка.
Как и в случае таблицы виртуальных методов, таблица динами-
ческих методов записывается в инициализированную часть сегмента
данных прикладной программы.
ТВМ TDerived ТДМ TDerived
┌───────────────────┐ ┌──────────────────┐
│ 6 │ │ Смещ. ТДМ TBase │
├───────────────────┤ ├──────────────────┤
│ -6 │ │ индекс в кеше │
├───────────────────┤ ├──────────────────┤
│ Смещ. ТДМ TDerived│ │ смещение записи │
├───────────────────┤ ├──────────────────┤
│ 0 │ │ 3 │
├───────────────────┤ ├──────────────────┤
│ │ │ 10 │
│ @TBase.Done │ ├──────────────────┤
│ │ │ 30 │
└───────────────────┘ ├──────────────────┤
│ 50 │
├──────────────────┤
│ │
│ @TDerived.P10 │
│ │
├──────────────────┤
│ │
│ @TDerived.P30 │
│ │
├──────────────────┤
│ │
│ @TDerived.T50 │
│ │
└──────────────────┘
Рис. 21.11. Схемы таблицы виртуальных методов и таблицы ди-
намических методов для TDerived.
Первое слово таблицы динамических методов содержит смещение
сегмента данных родительской таблицы динамических методов, или 0,
если родительская таблица динамических методов отсутствует.
Второе и третье слово таблицы динамических методов использу-
ется в кеш-буфере просмотра динамических методов (см. далее).
Четвертое слово таблицы динамических методов содержит счет-
чик записи таблицы динамических методов. Непосредственно за ним
следует список слов, каждое из которых содержит индекс динамичес-
кого метода, а затем список соответствующих указателей методов.
Длина каждого списка задается счетчиком записи таблицы динамичес-
ких методов.