Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.11.18;
Скачать: [xml.tar.bz2];

Вниз

Virtual and dynamic methods   Найти похожие ветки 

 
Sers   (2002-11-06 12:39) [0]

Добрый день.

Покажите разницу между этими понятиями. Я прочитал, что одни из них более производительны, в то время как другие лучши используют память. Меня же интересует аспекты реализации этих двух методов.
И еще, то что в С++ называлось virtual в Дельфи что ? Virtual или dynamic ?

Заранее благодарен.


 
Calm   (2002-11-06 12:44) [1]

Какие-то различия в огранизации таблицы виртуальных методов.
Точнее не знаю :(
А для чего такие тонкости? Мне кажется, если бы это имело значение, то в help-е было бы обращено на это внимание.


 
Sers   (2002-11-06 13:37) [2]

Интересно. Почему в С++ хватило только virtual, а разработчики Delphi решили ввести два понятия - virtual и dinamic. Значит зачем то это было надо.


 
Digitman   (2002-11-06 14:01) [3]

Читаем хэлп :

Virtual versus dynamic

Virtual and dynamic methods are semantically equivalent. They differ only in the implementation of method-call dispatching at runtime. Virtual methods optimize for speed, while dynamic methods optimize for code size.
In general, virtual methods are the most efficient way to implement polymorphic behavior. Dynamic methods are useful when a base class declares many overridable methods which are inherited by many descendant classes in an application, but only occasionally overridden.


 
Sers   (2002-11-06 14:13) [4]

Это все я уже читал (что я и подчеркнул в первом своем сообщении). О том, когда и что использовать вопроса у меня не вызывает. Вопрос в том, почему это именно так. Ответ кроется в реализации dynamic и virtual функций - соответственно и вопрос о том, как они реализованны. А из любезно приведенной тобой цитаты я не могу получить такой информации.

Впрочем, все равно спасибо. :)


 
Hirara   (2002-11-06 14:16) [5]

ну типа для виртуальных методов используется таблица VMT, а для динамических - DMT, ну и короче VMT весит больше, зато по ней метод ищется быстрей


 
Набережных С.   (2002-11-06 16:42) [6]

В DMT класса хранятся указатели только на те методы, которые определены в данном классе. Следовательно, при вызове унаследованного нужно его найти, просматривая последовательно все классы-предки. Зато экономится память.
VMT хранит указатели на все последние версии виртуальных методов класса(а может и вообще все версии, я досконально не вникал, но, думаю, вряд-ли). Быстро, но расход памяти больше. Никакой другой разницы мне не известно.


 
Alex4444444444   (2002-11-06 16:49) [7]

T.e., eto deystvitel"no imeet smysl (dynamic), kogda ih MNOGO *I* oni perekryvayutsya REDKO *I* v BOL"SHOM kolichestve potomkov? (T.k., kak ya ponimayu, raz oni idut ne "podryad", vmeste s ukazatelem nuzhno hranit" i chto-to typa ID.)


 
Alex4444444444   (2002-11-06 16:52) [8]

Mozhet, Vy togda eshe ob"yasnite, kak hranyatsya message handlers (procedure ...; message WM_SOMETHING;) i kogda imeet smysl ispol"zovat" ih? Dlya sebya ya ponyal, chto kogda ne ochen" vazhna skorost" i ochen" redko (v smysle hyerarchii) etot method nuzhen. Pravil"no? (Konechno, ne schitaya "chestnyh" messages.)


 
han_malign   (2002-11-06 17:30) [9]

На самом деле динамические методы индексированны(индекс можно задавать руками), и указатель на метод ищется по индексу, тогда как адресс виртуального метода находится по смещению в VMT.

Вызов виртуального метода
vm.V
mov EAX,[VM] - в EAX загружается адрес таблицы виртуальных методов
mov EDX,[EAX+(смещение метода)] - в EDX загружается адрес адреса метода
call dword ptr [EDX] - вызов метода
Вызов динамического метода
vm.D
mov EAX,[vm]
mov BX,(индекс метода)
call @CallDynaInst

из System.pas

procedure GetDynaMethod;
{ function GetDynaMethod(vmt: TClass; selector: Smallint) : Pointer; }
asm
{ -> EAX vmt of class }
{ BX dynamic method index }
{ <- EBX pointer to routine }
{ ZF = 0 if found }
{ trashes: EAX, ECX }

PUSH EDI
XCHG EAX,EBX
JMP @@haveVMT
@@outerLoop:
MOV EBX,[EBX]
@@haveVMT:
MOV EDI,[EBX].vmtDynamicTable
TEST EDI,EDI
JE @@parent
MOVZX ECX,word ptr [EDI]
PUSH ECX
ADD EDI,2
REPNE SCASW
JE @@found
POP ECX
@@parent:
MOV EBX,[EBX].vmtParent
TEST EBX,EBX
JNE @@outerLoop
JMP @@exit

@@found:
POP EAX
ADD EAX,EAX
SUB EAX,ECX { this will always clear the Z-flag ! }
MOV EBX,[EDI+EAX*2-4]

@@exit:
POP EDI
end;

procedure _CallDynaInst;
asm
PUSH EAX
PUSH ECX
MOV EAX,[EAX]
CALL GetDynaMethod
POP ECX
POP EAX
JE @@Abstract
JMP EBX
@@Abstract:
POP ECX
JMP _AbstractError
end;



 
Набережных С.   (2002-11-06 18:27) [10]

> han_malign © (06.11.02 17:30)
>На самом деле

И где здесь противоречие моему посту? Как вообще этот поиск можно бало бы организовать без индекса?


 
Набережных С.   (2002-11-06 18:42) [11]

>Alex4444444444 (06.11.02 16:52)
Обработчики сообщений - динамические методы, если я ничего не путаю. Индексом для них служит идентификатор сообщения. Сообщений слишком много и их обработчики часто перекрываются - неразумно было бы делать их виртуальными.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2002.11.18;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.009 c
14-59330
RV
2002-10-31 17:29
2002.11.18
Мобилы. SMS с них, на мыло. КАК?!? Если возможно.


1-59196
bloodman
2002-11-08 23:35
2002.11.18
TStringGrid


1-59209
Artem_O
2002-11-06 14:49
2002.11.18
Delay


4-59515
TankMan
2002-10-07 00:52
2002.11.18
Список запущенных процессов


14-59413
kaif
2002-10-31 00:27
2002.11.18
Инсталляция апача под win32





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский