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



ЗНАЕТЕ ЛИ ВЫ?

Внутрішнє представлення об’єктів

Поиск

Внутрішній формат даних об’єкта нагадує внутрішній формат запису. Поля об’єкту записуються в порядку їх опису як неперервна послідовність змінних. Будь-яке поле, успадковане від батьківського типу, записується перед новими полями, визначеними в дочірньому типі.

Якщо об’єктний тип визначає віртуальні методи, конструктори чи деструктори, то компілятор розміщає в ньому додаткове поле даних. Це 16-бітове поле, що називається полем таблиці віртуальних методів, використовується для запам’ятовування зміщення таблиці віртуальних методів в сегменті даних. Поле таблиці віртуальних методів розміщується безпосередньо після звичайних полів об’єктного типу. Якщо об’єктний тип успадковує віртуальні методи, конструктори чи деструктори, то він успадковує і поле VMT, завдяки чому додаткове поле таблиці віртуальних методів не розміщається.

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

Наступний приклад ілюструє представлення в сегменті даних об’єктів типів TStudent і TStudent1.

 

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

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

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

Друге слово таблиці віртуальних методів містить від’ємний розмір екземплярів відповідного об’єктного типу. Ця інформація використовується програмою контролю викликів віртуальних методів для виявлення неініціалізованих об’єктів (екземплярів, для яких не був здійснений виклик конструктора) і для перевірки правильності таблиці віртуальних методів. Якщо дозволений контроль віртуального виклику за допомогою директиви {$R+}, то компілятор генерує виклик підпрограми контролю звертання до таблиці віртуальних методів перед кожним викликом віртуального метода. Ця підпрограма перевіряє нерівність першого слова VMT нулю і рівність суми першого і другого слів нулю. Якщо кожна з перевірок виявила неспівпадіння, то генерується помилка виконання з кодом 210.

Дозвіл перевірок границь діапазонів і перевірок викликів віртуальних методів сповільнює виконання програми і робить розмір EXE-файлів дещо більшим, тому рекомендується використовувати директиву {$R+} тільки під час налагодження і переключати цю директиву в {$R-} у остаточній версії програми.

Третє слово VMT містить зміщення сегменту даних об’єктного типу в таблиці динамічних методів (DMT) чи 0, якщо об’єкт не містить динамічних методів.

Четверте слово VMT резервується і завжди рівне 0.

Нарешті, починаючи зі зміщення 8 таблиці віртуальних методів, йде список 32-розрядних вказівників методів (однин вказівник на кожен віртуальний метод в порядку їх опису). Кожна позиція містить адресу точки входу відповідного віртуального метода.

Наступний приклад демонструє розміщення таблиць віртуальних методів типів TStudent і TStudent1. Кожен маленький прямокутник відповідає одному слову пам’яті, а кожен більший – двом словам пам’яті.

Зверніть увагу на те, як TStudent1 успадковує поліморфний метод ShowName.

Як вже згадувалося, конструктори об’єктних типів містять спеціальний код, що запам’ятовує зміщення таблиці віртуальних методів об’єктного типу та ініціалізованих екземплярів. Наприклад, якщо маємо екземпляр S типу TStudent і екземпляр T  типу TStudent1, то виклик S.Init буде автоматично записувати зміщення таблиці віртуальних методів типу TStudent в поле таблиці віртуальних методів екземпляра S, а виклик T.Init – запише зміщення VMT типу TStudent1 в поле VMT екземпляра Т. Ця автоматична ініціалізація є частиною коду входу конструктора, тому, якщо управління передається в початок операторної секції, то поле таблиці віртуальних методів параметра Self теж буде установлено. Таким чином, при необхідності конструктор може виконувати виклик віртуального методу.

 



Поделиться:


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

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