Функції роботи з таблицею віртуальних методів 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Функції роботи з таблицею віртуальних методів



Для безпосередньої роботи з VMT використовуються дві функції:

Function SizeOf(Obj):Word;

 

Function TypeOf(Obj):Pointer;

 

Застосована до екземпляра об’єктного типу, що має таблицю віртуальних методів, стандартна функція SizeOf поверне записаний в таблиці віртуальних методів розмір. Таким чином, для об’єктів, що мають таблицю віртуальних методів, функція SizeOf завжди повертає дійсний розмір екземпляра, а не приведений у описі.

Крім того, Pascal надає нову стандартну функцію TypeOf, що повертає вказівник на таблицю віртуальних методів об’єктного типу. Функція TypeOf приймає єдиний параметр, який може бути ідентифікатором об’єктного типу або екземпляром об’єктного типу. В обох випадках результат типу Pointer є вказівником на таблицю віртуальних методів об’єктного типу. TypeOf може застосовуватися лише до об’єктних типів, що мають VMT. Застосування цієї функції до інших типів призведе до помилки.

Функція TypeOf може використовуватися для перевірки фактичного типу екземпляра. Наприклад:

If TypeOf(Self)=TypeOf(TStudent) then…

 

Таблиця динамічних методів

Таблиця віртуальних методів об’єктного типу містить для кожного описаного в об’єктному типі віртуального методу і його предків 4-байтовий запис. Коли в породжуючих типах (предках) визначається велике число віртуальних методів, в процесі створення дочірніх типів може використовуватися досить великий об’єм пам’яті, особливо якщо цих дочірніх типів є багато. Хоча в дочірніх типах можуть перевизначатися тільки деякі із успадкованих методів, таблиця віртуальних методів кожного дочірнього типу містить вказівник методу для всіх успадкованих віртуальних методів, навіть якщо вони не перевизначалися.

Динамічні методи забезпечують в таких випадках альтернативу. Для таких методів в Pascal-і вводиться новий формат таблиці методів і новий спосіб обробки викликів методів з пізнім зв’язуванням. Замість кодування всіх методів об’єктного типу з пізнім зв’язуванням в таблиці динамічних методів (DMT) кодуються лише ті методи, які були в об’єктному типі перевизначені. Якщо в похідних типах перевизначаються лише деякі з великого числа методів з пізнім зв’язуванням, формат таблиці динамічних методів використовує менший простір, ніж формат таблиці віртуальних методів.

Об’єктний тип має таблицю динамічних методів тільки тоді, коли в ньому вводяться чи перевизначаються, інакше він просто успадковує таблицю динамічних методів свого предка.

Як і у випадку таблиці віртуальних методів, таблиця динамічних методів записується в ініціалізовану частину сегменту даних прикладної програми.

Перше слово таблиці динамічних методів містить зміщення в сегменті даних батьківської таблиці динамічних методів чи 0, якщо батьківська таблиця динамічних методів відсутня.

Друге і третє слова DMT використовуються в кеш-буфері перегляду динамічних методів.

Четверте слово таблиці динамічних методів містить лічильник числа записів таблиці динамічних методів. Безпосередньо після нього йде список слів, кожне з яких містить індекс динамічного методу, а потім список відповідних вказівників методів. Довжина кожного списку задається лічильником числа записів DMT.

 

Виклик статичних методів

Методи використовують ті самі узгодження про виклики, що й звичайні процедури і функції, за винятком того, що кожен метод має неявний додатковий параметр Self, який відповідає параметру-змінній того ж типу, що і об’єктний тип даного методу. Параметр Self завжди передається останнім і має вигляд 32-розрядного вказівника на екземпляр, з якого викликається метод.

При поверненні метод повинен видалити параметр Self зі стеку так само, як він це робить зі звичайними параметрами. Методи завжди використовують далекий тип виклику незалежно від директиви $F компілятора.

 

Виклик віртуальних методів

Для виклику віртуального методу компілятор генерує код, який вибирає адресу таблиці віртуальних методів об’єкту і потім викликає метод, використовуючи зв’язану з ним точку входу. Послідовність дій при цьому буде такою: передача параметра Self, встановлення зміщення VMT з поля VMT, виклик відповідного методу через інструкцію Call з врахуванням зміщення.

 

Виклик динамічних методів

Обробка виклику динамічного методу складніша і вимагає більше часу, ніж виклик віртуального методу. Замість використання інструкції Call для виклику через вказівник методу по статичному зміщенню в таблиці віртуальних методів, таблиця динамічних методів об’єктного типу і таблиця динамічних методів його предка повинні переглядатися в пошуку «найбільш верхнього» входження індексу конкретного динамічного методу, а виклик потім повинен виконуватися через відповідний вказівник методу. Цей процес вимагає використання значно більшого числа інструкцій, які можна записати як вбудовані (INLINE), тому Pascal містить підпрограму обробки викликів, що використовується при виклику динамічного методу.

Спершу обробник вибирає зміщення таблиці динамічних методів з таблиці віртуальних методів. Потім використовується кешований індекс – поле таблиці динамічних методів. Обробник перевіряє, чи є індекс викликаного динамічного методу індексом того динамічного методу, який викликався останнім. Якщо це так, то він негайно передає управління цьому методу, використовуючи непрямий перехід за допомогою вказівника методу, записаного по зміщенню, заданому полем «кешоване зміщення». Якщо динамічний індекс викликаного методу не співпадає з тим, який записаний у кеші, то обробник переглядає власну і батьківські таблиці динамічних методів, використовуючи поле DMT зі зміщенням батьківської DMT, поки не знайде запис з даним індексом динамічного методу. Індекс і зміщення відповідного вказівника методу записуються потім в кешовані поля таблиці динамічних методів, а управління передається методу. Якщо з якихось причин обробник не може знайти запис з даним індексом динамічного методу, він завершує прикладну програму з кодом помилки виконання 210.

Попри використання кешування і добре оптимізованої підпрограми обробки викликів, обробка виклику динамічного методу може вимагати значно більше часу, ніж виклик віртуального методу. Однак у тих випадках, коли самі дії, що виконуються динамічним методом, вимагають багато часу, додатковий простір, що зберігається таблицями динамічних методів може виявитися істотнішим.

 



Поделиться:


Последнее изменение этой страницы: 2021-12-15; просмотров: 41; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.21.76.0 (0.005 с.)