2013-03-14 4 views
19

Как динамические методы улучшают размер кода?
Какой размер кода означает ??? Это означает, что размер файла program.exe?В чем разница между динамическими и виртуальными методами?

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

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

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

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

+0

Две цитаты говорят вам, что вам нужно знать. Ибо, на мой взгляд, всегда используется виртуальное. –

+0

@DavidHeffernan Сообщение отредактировано! – EProgrammerNotFound

ответ

38

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

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

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

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

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

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

+0

+1 Динамическое усиление действительно напрасно, когда вы сравниваете его с огромным размером исполняемого файла, созданным последними версиями Delphi. –

+2

+1 Очень хорошее объяснение !! Спасибо большое!!Я прочитаю всю статью – EProgrammerNotFound

+4

Реализация DMT в Delphi (которая в основном используется для отправки сообщений в окне) может быть намного быстрее, если DMT будет сортироваться (компилятором), поэтому вместо линейного поиска можно использовать двоичный поиск выполните поиск, чтобы найти указатели метода. –

Смежные вопросы