TURBO PASCAL

Новости

Программы   

Turbo Pascal 

Игры

Документация   

Странности

FAQ

Ссылки

Форум

Гостевая книга

Рассылка

Благодарности

Об авторе

 

 

Вызовы динамических методов 

             Диспетчеризация вызова динамического метода несколько  более
        сложна и требует больше времени, чем диспетчеризация виртуального
        метода.  Вместо использования инструкции CALL  для  вызова  через
        указатель  метода  по статическому смещению в таблице виртуальных
        методов, таблица динамических методов объектного типа  и  таблица
        динамических  методов  его предка должны просматриваться в поиске
        "самого верхнего" вхождения индекса конкретного динамического ме-
        тода, а вызов затем должен выполняться через соответствующий ука-
        затель метода.  Этот процесс  требует  использования  существенно
        большего числа инструкций,  которые можно записать, как "встроен-
        ные" (inline),  поэтому Турбо Паскаль  обеспечивает  подпрограмму
        диспетчеризации, используемую при вызове динамического метода.
             Если бы метод Show показанного выше типа TPoint
        описывался как динамический метод (с индексом динамического
        метода 200), то вызов PP^.Show, где PP имеет тип TPointPtr,
        привел бы к генерации следующего кода:

             les      di,PP            ; загрузка PP в ED:DI
             push     es               ; передача, как параметра
                                       ; Self
             push     di
             mow      di,es:[di+6]     ; извлечение смещения
                                       ; таблицы виртуальных методов
                                       ; из поля таблицы
                                       ; виртуальных методов
             mov      ax,200           ; загрузка в AX индекса
                                       ; динамического метода
             call     Dispatch         ; вызов подпрограммы
                                       ; диспетчеризации

             Диспетчер выбирает сначала смещение таблицы динамических ме-
        тодов  от  таблицы виртуальных методов,  на которое указывает ре-
        гистр DI. Затем используется "индекс в кеше" - поле таблицы дина-
        мических методов. Диспетчер проверяет, является ли индекс вызван-
        ного динамического метода индексом того динамического метода, ко-
        торый вызывался последним.  Если это так,  он немедленно передает
        этому методу управление (путем перехода с помощью указателя мето-
        да,  записанного по смещению, заданному полем "смещение записи").

             Если динамический  индекс  вызванного  метода не совпадает с
        тем,  который записан в кеше,  то диспетчер просматривает таблицу
        динамических  методов и родительскую таблицу динамических методов
        (следуя по связям в таблице динамических  методов),  пока  он  не
        найдет запись,  с данным индексом динамического метода.  Индекс и
        смещение соответствующего указателя метода записываются  затем  в
        поле таблицы динамических методов,  а управление передается мето-
        ду. Если по каким-либо причинам диспетчер не может найти запись с
        данным  индексом  динамического  метода,  он завершает прикладную
        программу с кодом ошибки этапа выполнения 210.
          Вопреки кешированию  и  высокооптимизированной  подпрограмме
        диспетчеризации,  диспетчеризация динамического метода может пот-
        ребовать существенно больше времени, чем вызов виртуального мето-
        да. Однако в тех случаях,  когда сами действия, выполняемые дина-
        мическим методом,  требуют много времени,  дополнительное  прост-
        ранство,  сохраняемое таблицами динамических методов, может пере-
        весить этот недостаток.

Содержание

На первую страницу

Rambler's Top100 Rambler's Top100
PROext: Top 1000

(с)Все права защищены

По всем интересующим вопросам прошу писать на электронный адрес

Hosted by uCoz