Как я могу увидеть VMT в паскале?

Могу ли я как-нибудь увидеть таблицу VMT в FREE Pascal? Меня интересует, имеет ли таблица VMT одинаковое количество элементов в двух объектах, связанных наследственностью?

Например, что будет в таблице VMT в этой модели?

Будет ли одна таблица для всех функций или более (таблица между [Ob1 AND Ob2] и таблица между [Ob2 AND Ob3])?

Что будет в таблице (ах)?

Ob1 = object
  constructor Init;
  function f1..; virtual;
  function f2..; virtual;
end;


Ob2 = object(Ob1)
  constructor Init;
  function f1...; virtual;
  function f2...; virtual;
  function f3...; virtual;
end;

Ob3 = object(Ob2)
  constructor Init;
  function f1...; virtual;
  function f2...; virtual;
  function f3...; virtual;
end;

1 ответ

Могу ли я как-нибудь увидеть таблицу VMT в FREE Pascal?

Во время выполнения вы можете получить указатель на VMT экземпляра объекта с помощью встроенного TypeOf (например:TypeOf(Obj)). Внутренняя структура возвращаемого VMT описана в разделе 8.2.12 Типы объектов Руководства программиста Free Pascal.

Вы также можете сбрасывать VMT во время компиляции. Для этого скомпилируйте вашу программу с-alвариант ("Список строк исходного кода в файле ассемблера") и читать строки в сгенерированном.sфайл, относящийся к VMTs. Для вашего примера я получил это на своем ПК (Win32 for i386 цель):

.section .data.n_VMT_$P$PROGRAM_$$_OB1,"d"
    .balign 4
.globl  VMT_$P$PROGRAM_$$_OB1
VMT_$P$PROGRAM_$$_OB1:
    .long   4,-4,0
    .long   P$PROGRAM$_$OB1_$__$$_F1$$LONGINT
    .long   P$PROGRAM$_$OB1_$__$$_F2$$LONGINT
    .long   0

.section .data.n_VMT_$P$PROGRAM_$$_OB2,"d"
    .balign 4
.globl  VMT_$P$PROGRAM_$$_OB2
VMT_$P$PROGRAM_$$_OB2:
    .long   4,-4
    .long   VMT_$P$PROGRAM_$$_OB1
    .long   P$PROGRAM$_$OB2_$__$$_F1$$LONGINT
    .long   P$PROGRAM$_$OB2_$__$$_F2$$LONGINT
    .long   P$PROGRAM$_$OB2_$__$$_F3$$LONGINT
    .long   0

.section .data.n_VMT_$P$PROGRAM_$$_OB3,"d"
    .balign 4
.globl  VMT_$P$PROGRAM_$$_OB3
VMT_$P$PROGRAM_$$_OB3:
    .long   4,-4
    .long   VMT_$P$PROGRAM_$$_OB2
    .long   P$PROGRAM$_$OB3_$__$$_F1$$LONGINT
    .long   P$PROGRAM$_$OB3_$__$$_F2$$LONGINT
    .long   P$PROGRAM$_$OB3_$__$$_F3$$LONGINT
    .long   0

Здесь вы можете ясно видеть, что виртуальные методы запускаются из четвертых ячеек в VMT. Первая ячейка VMT - это размер объекта, третья - указатель на родительский VMT. В-4s - отрицательные размеры объектов и используются для проверки указателей на VMT.

Будет ли одна таблица для всех функций или более (таблица между [Ob1 AND Ob2] и таблица между [Ob2 AND Ob3])?

По одному VMT для каждого типа объекта. Таблиц между объектами нет, VMT привязаны к самим объектам.

Другие вопросы по тегам