TURBO PASCAL |
Новости
|
Таблица динамических методовТаблица виртуальных методов объектного типа содержит для каждого описанного в объектном типе виртуального метода и его предков четырехбайтовую запись. В тех случаях, когда в порождаю- щих типах (предках) определяется большее число виртуальных мето- дов, в процессе создания производных типов может использоваться достаточно большой объем памяти, особенно если создается много производных типов. Хотя в производных типах могут переопределять- ся только некоторые из наследуемых методов, таблица виртуальных методов каждого производного типа содержит указатели метода для всех наследуемых виртуальных методов, даже если они не изменя- лись. Динамические методы обеспечивают в таких ситуациях альтерна- тиву. В 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, если родительская таблица динамических методов отсутствует. Второе и третье слово таблицы динамических методов использу- ется в кеш-буфере просмотра динамических методов (см. далее). Четвертое слово таблицы динамических методов содержит счет- чик записи таблицы динамических методов. Непосредственно за ним следует список слов, каждое из которых содержит индекс динамичес- кого метода, а затем список соответствующих указателей методов. Длина каждого списка задается счетчиком записи таблицы динамичес- ких методов. |
(с)Все права защищены По всем интересующим вопросам прошу писать на электронный адрес |