Форум: "Основная";
Текущий архив: 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