2013-03-14 14 views
19

W jaki sposób metody dynamiczne poprawiają rozmiar kodu?
Jaki rozmiar kodu oznacza ??? Oznacza to rozmiar pliku programu.exe?Jaka jest różnica między metodami dynamicznymi i wirtualnymi?

Według podręcznika:

Generalnie, metody wirtualne są najskuteczniejszym sposobem wdrożenia polimorficzne. Metody dynamiczne są użyteczne, gdy klasa bazowa deklaruje wiele nadpisywalnych metod, które są dziedziczone przez wiele klas potomnych w aplikacji, ale tylko czasami są przesłonięte.

Co zyskam, jeśli używam dynamicznego zamiast wirtualnego gdy tylko jedno z odziedziczonych klas zastąpić metodę, gdyż instrukcja mówi:

metody wirtualne optymalizacji prędkości, podczas gdy metody dynamiczne optymalizacji rozmiar kodu.

+0

Dwa cytaty powiedzieć, co trzeba wiedzieć. Dolna linia jest, moim zdaniem, zawsze używana wirtualnie. –

+0

@DavidHeffernan Post edytowany! – EProgrammerNotFound

Odpowiedz

38

Metody wirtualne są realizowane za pomocą wirtualnej tabeli metod (VMT). Dla każdej klasy istnieje jeden VMT. VMT zawiera jeden wpis dla każdej wirtualnej metody w klasie. I ten wpis jest adresem metody.

Pozwala to na bardzo wydajne nawiązywanie połączeń. Po prostu otrzymasz adres VMT, który znajduje się w stałej zmianie od Self. Następnie wyszukujesz wskaźnik metody według indeksu i wywołujesz metodę.

Co to znaczy, że jeśli masz klasę z wieloma wirtualnymi metodami, a ty uzyskujesz pod-klasę, stworzysz zupełnie nowy VMT ze wszystkimi wirtualnymi metodami. A jeśli nie zastąpiłeś wielu z nich, to przekonasz się, że VMT mają wiele pokryć się.

To miało znaczenie w dniach 16 bitów. VMT mogą zajmować dużo miejsca w obrazie wykonywalnym (co oznacza rozmiar kodu) i może zabraknąć miejsca dla VMT. Wprowadzono więc metody dynamiczne. Analogiem do VMT jest tablica metod dynamicznych, DMT. Jest to realizowane inaczej, aby uniknąć powtarzania, gdy metody nie są nadpisywane. Minusem jest to, że wywoływanie metod dynamicznych jest droższe.

W czasach współczesnych, od 32-bitowych, a zwłaszcza z bardzo grubymi plikami wykonywalnymi, które produkuje Delphi, problemy z wielkością nie mają znaczenia. Tak więc wszelką rozsądną radą jest stosowanie wyłącznie metod wirtualnych.

Implementacje tabel metod wirtualnych są dobrze znane i istnieje wiele odnośników do ich zrozumienia. W mniejszym stopniu dotyczy to metod dynamicznych, które są dość osobliwe. Najlepszym źródłem informacji znalazłem są z bloga Hallvarda Vassbotn za:

+0

+1 Zysk dynamiczny jest naprawdę próżny, gdy porównamy z ogromnym rozmiarem pliku wykonywalnego wygenerowanego przez najnowsze wersje Delphi. –

+2

+1 Bardzo ładne wyjaśnienie !! Dziękuję bardzo!!Przeczytam cały artykuł – EProgrammerNotFound

+4

Implementacja DMT w Delphi (która służy głównie do wysyłania komunikatów okna) może być znacznie szybsza, jeśli DMT zostanie posortowany (przez kompilator), więc zamiast liniowego może zostać użyte wyszukiwanie binarne szukaj, aby znaleźć wskaźniki metod. –

Powiązane problemy