8.2.13. Классы

На верх  Назад  Вперёд

Подобно объектам, классы хранятся в памяти как обычные записи с дополнительным полем: указателем на таблицу виртуальных методов – Virtual Method Table (VMT). Это поле записывается первым, а все поля класса записываются в том порядке, в каком они объявлены.

В отличие от объекта, все поля класса всегда хранятся в динамической памяти.

Объём выделяемой памяти выглядит так, как показано в таблице 8.6.

Таблица 8.6. Распределение памяти для класса (32/64-разрядная модель).

Смещение

Содержимое

32 бит

64 бит

+0

+0

Указатель на VMT

+4

+8

Данные. Все поля в порядке объявления

 

Таблица виртуальных методов (VMT) для каждого класса состоит из нескольких полей, которые используются для информации во время выполнения. Макет VMT показан в таблице 8.7. VMT создаётся компилятором.

Таблица 8.7. Распределение памяти для VMT класса (32/64-разрядная модель).

Смещение

Содержимое

32 бит

64 бит

+0

+0

Размер данных объектного типа.

+4

+8

Минус размер данных объектного типа. Позволяет определить правильность указателей VMT.

+8

+16

Указатель на VMT предка, Nil, если нет доступных предков.

+12

+24

Указатель на имя класса (хранится как shortstring)

+16

+32

Указатель на динамическую таблицу методов (использующую message с целыми числами).

+20

+40

Указатель на таблицу определения методов.

+24

+48

Указатель на таблицу определения полей.

+28

+56

Указатель на таблицу типа информации.

+32

+64

Указатель на таблицу инициализации экземпляра.

+36

+72

Зарезервировано.

+40

+80

Указатель на таблицу интерфейса.

+44

+88

Указатель на таблицу динамических методов (использующую message со строками).

+48

+96

Указатель на деструктор Destroy.

+52

+104

Указатель на метод NewInstance.

+56

+112

Указатель на метод FreeInstance.

+60

+120

Указатель на метод SafeCallException.

+64

+128

Указатель на метод DefaultHandler.

+68

+136

Указатель на метод AfterConstruction.

+72

+144

Указатель на метод BeforeDestruction.

+76

+152

Указатель на метод DefaultHandlerStr.

+80

+160

Указатель на метод Dispatch.

+84

+168

Указатель на метод DispatchStr.

+88

+176

Указатель на метод Equals.

+92

+184

Указатель на метод GetHashCode.

+96

+192

Указатель на метод ToString.

+100

+200

Указатели на другие виртуальные методы.

 

Посмотрите файл rtl / inc / objpash.inc для самой последней информации VMT.