Подтвердить что ты не робот

В чем разница между динамическими и виртуальными методами?

Как динамические методы улучшают размер кода?

Какой размер кода означает??? Это означает, что размер файла program.exe

Согласно руководству:

В общем, виртуальные методы являются наиболее эффективным способом реализации полиморфное поведение. Динамические методы полезны, когда базовый класс объявляет множество переопределяемых методов, которые наследуются многими классы потомков в приложении, но только изредка переопределяется.

Что я получаю, если я использую динамический, а не виртуальный, когда только один из унаследованных классов переопределяет метод, так как в руководстве также говорится:

виртуальные методы оптимизируются для скорости, а динамические методы оптимизируют размер кода.

4b9b3361

Ответ 1

Виртуальные методы реализуются с помощью таблицы виртуальных методов (VMT). Для каждого класса есть один VMT. VMT содержит одну запись для каждого виртуального метода в классе. И эта запись является адресом метода.

Это позволяет очень эффективный вызов. Вы просто получаете адрес VMT, который находится с фиксированным смещением от Self. Затем вы просматриваете указатель метода по индексу и вызываете метод.

Это означает, что если у вас есть класс с большим количеством виртуальных методов, и вы получите подкласс, вы создадите новый VMT со всеми виртуальными методами. И если вы не переопределили многие из них, вы обнаружите, что VMT имеют много перекрытий.

Это имело значение в дни 16 бит. VMT могут занимать много места в исполняемом изображении (что подразумевается под размером кода), и вы могли бы пробежать пространство для VMT. Так были введены динамические методы. Аналогом VMT является таблица динамических методов, DMT. Это выполняется по-разному, чтобы избежать повторения, когда методы не переопределены. Недостатком является то, что вызов динамических методов дороже.

В наше время, начиная с 32 бит, и особенно с очень толстыми исполняемыми файлами, которые производит Delphi, эти проблемы с размером не имеют значения. И поэтому все разумные советы - использовать исключительно виртуальные методы.

Реализации таблиц виртуальных методов хорошо поняты, и их можно найти много, чтобы понять их. Это тем более для динамических методов, которые довольно странны. Лучшие источники информации, которые я нашел, принадлежат блогу Hallvard Vassbotn: