2009-04-15 24 views
6

Jak rozumiem, wszystkie funkcje składowe są wirtualne w D, ale kompilator może dowolnie udostępniać funkcje, które nie są wirtualne, jeśli nigdy nie zostaną nadpisane.Czy istnieje sposób na zapewnienie, że funkcje członkowskie są wirtualne w D?

Nie jestem pewien, co dzieje się podczas kompilacji modułu, w którym funkcje członkowskie nie są nadpisywane, a następnie zaimportować ten moduł w innym miejscu, w którym zastępujesz funkcję składową. Nie sądzę, żeby ponownie skompilował oryginalny moduł. Czy zakłada po prostu, że każda funkcja członka z zewnętrznym powiązaniem jest wirtualna?

Odpowiedz

5

Wszystkie funkcje składowe D są domyślnie wirtualne. Nie sądzę, że istnieją jakiekolwiek kompilatory, które faktycznie sprawiają, że funkcje nie są wirtualne jako optymalizacja. Możesz to zrobić ręcznie, zaznaczając klasę lub funkcję jako "ostateczną".

1

Wierzę, że FeepingCreature jest poprawny, ale dodatkowo myślę, że można założyć, że takie optymalizacje będą uwzględniane przez kompilator tylko wtedy, gdy bezpośrednio tworzy plik wykonywalny ze źródeł.

2

FeepingCreature jest w większości poprawny, z wyjątkiem funkcji szablonowych, których nie można uczynić wirtualnymi.

2

Sposób implementacji jest zależny od kompilatora i łącza. Ale jedną często spotykaną sytuacją, w której można zoptymalizować wywołania funkcji wirtualnej, jest lokalna instancja klasy. Następnie wywołania funkcji mogą być wykonywane bezpośrednio w tym zakresie, ponieważ typ klasy jest w pełni znany w czasie kompilacji. Można to zrobić na poziomie kompilatora.

Poza tym, jeśli linker uświadomi sobie, że implementacja funkcji nigdy nie jest nadpisywana, to linker może przeprowadzić optymalizację i zamienić wirtualne wywołania funkcji na bezpośrednie wywołania funkcji tej klasy. W szczególności, jeśli klasa nigdy nie jest wyprowadzana, wówczas wszystkie wywołania funkcji składowych mogą być wykonywane bezpośrednio. To tak, jakby linker wstawiał słowo kluczowe "ostateczny", gdy tylko było to możliwe. (Linker może nie stosować tej optymalizacji do wyeksportowanych klas i funkcji, ponieważ linker nie wie, czy funkcje zostały zastąpione w innych bibliotekach lub plikach wykonywalnych.)

Powiązane problemy