Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 6 124

/ вопрос решён /

Еще раз здравствуйте, уважаемые эксперты! Куда,например, после компиляции, попадет метод, объявленный как virtuаl? И почему его адрес не известен на этапе компиляции? Спасибо

Phantom Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Phantom (статус: Посетитель)
Вопрос отправлен: 10 мая 2012, 01:23
Состояние вопроса: решён, ответов: 2.

Ответ #1. Отвечает эксперт: min@y™

Типы методов
Методы объекта могут быть описаны как статические (static), виртуальные (virtual), динамические (dinamic) или как методы-сообщения (message). Рассмотрим следующий пример:

TFoo = class
  procedure IAmAStatic;
  procedure IAmAVirtual; virtual;
  procedure IAmADynamic; dynamic;
  procedure IAmAMessage(var M: TMessage); message wmSomeMessage; 
end;

Статические методы
Статический метод lAmAStatic работает подобно обычной процедуре или функции. Этот тип методов принимается по умолчанию. Адрес такого метода известен уже на стадии компиляции, и компилятор в тексте программы оформляет все вызовы данного метода как статические. Такие методы работают быстрее других, однако не могут быть перегружены с целью поддержки полиморфизма объектов.

Виртуальные методы
Метод IAmAVirtual объявлен как виртуальный. Вызов таких методов, благодаря возможности их перегрузки, немного сложнее, чем вызов статического метода, так как во время компиляции адрес конкретного вызываемого метода не известен. Для решения этой задачи компилятор строит таблицу виртуальных методов (Virtual Method Table, VMT), которая обеспечивает определение адреса метода в процессе выполнения программы. VMT содержит все виртуальные методы предка и виртуальные методы самого объекта, и потому виртуальные методы используют несколько большую память, чем методы динамические, но при этом их вызов происходит быстрее, чем вызов динамических методов.

Динамические методы
Динамический метод IAmADynamic в целом подобен виртуальным методам, но обслуживается другой диспетчерской системой. Каждому динамическому методу компилятор назначает уникальное число и использует его вместе с адресом метода для построения таблицы динамических методов (Dynamic Method Table — DMT). В отличие от VMT, DMT содержит только методы данного объекта, благодаря этому обеспечивается экономия используемой памяти, но одновременно замедляется вызов метода, поскольку для поиска его адреса, скорее всего, будет пересмотрена не одна DMT в иерархии объектов.

© С. Тейксейра & К. Пачеко.

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 10 мая 2012, 08:12
Оценка за ответ: 5

Ответ #2. Отвечает эксперт: DNK

Здравствуйте, Бородеев Илья Вадимович!
А я попробую объяснить на пальцах, почему адрес на этапе компиляции не известен. Допустим есть перменная типа a: TSrings и есть код в котором происходит кроме прочего очистка списка строк a.Clear;. Данный метод в классе TStrings описан как виртуальный и ещё пуще того абстрактный.
Так спрашивается какой адрес для вызова здесь компилятору поставить? Веть в данную переменную на этапе выполнения может попасть экземпляр любого из его потомков (TStringList, TTabStrings, TTreeStrings, TRichEditStrings, TPageAccess и тд. и тп.) и у каждого свой метод очистки. Вот тогда нас и выручают таблицы виртуальных методов, на элемент в которой и может сослаться компилятор.
Получается на этапе выполнения у нас имеются только переменная-указатель на объект и некий ключ к таблице виртуальных методов. По адресу в переменной находят конкретный экземпляр объекта, затем определяются его класс и таблица виртуальных методов, а уже затем происходит поиск адреса кода для очистки в таблице, на элемент которой сослался компилятор.

ЗЫ. Поправте если что, из головы брал.

Ответ отправил: DNK (статус: Студент)
Время отправки: 10 мая 2012, 12:37
Оценка за ответ: 5

Комментарий к оценке: спасибо DNK! т.е. виртуальный метод это "указатель" на процедуру? и на этапе выполнения программы он может принимать разные значения(адреса функций)?

Мини-форум вопроса

Всего сообщений: 2; последнее сообщение — 10 мая 2012, 15:49; участников в обсуждении: 2.
DNK

DNK (статус: Студент), 10 мая 2012, 14:49 [#1]:

Т.е. виртуальный метод это смещение в таблице. На этапе выполнения оно имеет одно и тоже значение. А вот содержимое ячеек этих таблиц (адреса функций) может быть разным для разных классов.
"Digital Networked Knight"
Phantom

Phantom (статус: Посетитель), 10 мая 2012, 15:49 [#2]:

как говорится "русским по белому" объяснили..Спасибо!

10 мая 2012, 16:32: Статус вопроса изменён на решённый (изменил модератор DNK)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:55
Выполнено за 0.02 сек.