Как я могу увидеть 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. В-4
s - отрицательные размеры объектов и используются для проверки указателей на VMT.
Будет ли одна таблица для всех функций или более (таблица между [Ob1 AND Ob2] и таблица между [Ob2 AND Ob3])?
По одному VMT для каждого типа объекта. Таблиц между объектами нет, VMT привязаны к самим объектам.