Rozważam użycie wirtualnego dziedziczenia w aplikacji czasu rzeczywistego. Czy używanie dziedziczenia wirtualnego ma wpływ na wydajność podobny do wywoływania funkcji wirtualnej? Obiekty, o których mowa, zostałyby utworzone dopiero przy uruchomieniu, ale jestem zaniepokojony, że wszystkie funkcje z hierarchii byłyby wysłane przez vtable lub gdyby były tylko te z wirtualnej klasy bazowej.Wpływ wydajności wirtualnego dziedziczenia
Odpowiedz
Typowe implementacje umożliwiają dostęp do elementów danych wirtualnych klas bazowych za pomocą dodatkowego pola pośredniego.
Jak zauważa James w swoich komentarzach, wywołanie funkcji składowej klasy bazowej w scenariuszu wielokrotnego dziedziczenia będzie wymagać korekty wskaźnika this
, a jeśli ta klasa podstawowa jest wirtualna, wówczas przesunięcie podklasy klasy podstawowej obiekt w obiekcie klasy pochodnej zależy od typu dynamicznego klasy pochodnej i będzie musiał zostać obliczony w czasie wykonywania.
Czy to ma jakikolwiek widoczny wpływ na wydajność aplikacji rzeczywistych zależy od wielu rzeczy:
uwagi baz wirtualne mają członkowie danych w ogóle? Często są to abstrakcyjne klasy bazowe, które muszą pochodzić z wirtualnych źródeł, a abstrakcyjne bazy, które mają dowolnych członków danych, są często zapachem kodu.
Zakładając masz wirtualnych baz danych z członkami są ci, obejrzano w ścieżce krytycznej? Jeśli użytkownik kliknie jakiś przycisk w GUI, otrzyma kilkadziesiąt dodatkowych pośredników, nikt tego nie zauważy.
Jaki byłby alternatywa jeśli wirtualne bazy unika? Nie tylko projekt może być gorszy, ale także alternatywny projekt ma wpływ na wydajność. W końcu musi osiągnąć ten sam cel i TANSTAAFL. Potem wymieniłeś jedną stratę wydajności na inną plus niższy projekt.
Dodatkowa uwaga: Zapraszamy do obejrzenia Stan Lippmann na Inside the C++ Object Model, która odpowiada na takie pytania dość dokładnie.
ABY wyjaśnić, tylko połączenia z wirtualnymi klasami podstawowymi członkowie/funkcje powodują dodatkowe pośrednie? – Graeme
@ Graeme: Z pewnością nie jestem ekspertem w tej dziedzinie, ale nie widzę, w jaki sposób połączenia z wirtualnymi członkami klasy podstawowej _functions_ spowodowałyby utratę wydajności. Są one wysyłane statycznie ('B :: f()') lub dynamicznie przez wirtualną tabelę klasy pochodnej, tak jak funkcje składowe nie-wirtualnych baz. ICBWT. – sbi
@sbi: Jeśli funkcja nie jest wirtualna, to wywoływaną funkcję można wybrać statycznie, ale wskaźnik "this" musi zostać obliczony [lub wyświetlony] w czasie wykonywania, prawda? –
Czy na pewno masz na myśli dziedziczenie wirtualne? Jeśli tak, to jest to identyczne z kosztem normalnego wirtualnego wywołania funkcji. Wyszukiwanie łańcuchowe vtable następuje po określonej ścieżce.
Powiedziałeś, że to było na starcie. Napowietrzny dysk (od zwykłego załadowania kodu do pamięci) prawdopodobnie będzie wymagał o rząd wielkości więcej niż pół tuzina instrukcji dla vtable odnośników. Byłbym nieco zaskoczony, gdybyś mógł to profilować i wykryć różnicę.
Spójrz na poniższą dużą próbę eksperymentalną opublikowaną OOPSLA'96. Kopiuję wklejenie wpisu bibtex, streszczenie i link do artykułu. Uznałbym to za najbardziej kompleksowe badanie eksperymentalne na ten temat.
@article{driesen1996direct,
title={{The direct cost of virtual function calls in C++}},
author={Driesen, K. and H{\\"o}lzle, U.},
journal={ACM Sigplan Notices},
volume={31},
number={10},
pages={306--323},
issn={0362-1340},
year={1996},
publisher={ACM}
}
Streszczenie: Badamy kosztów bezpośrednich funkcji wirtualnego połączenia programów w C++, przy założeniu standardowego wdrażania przy użyciu tabel funkcji wirtualnych. Mierzymy to narzut eksperymentalnie dla wielu dużych programów testowych , wykorzystując kombinację wykonywalnej inspekcji i symulacji procesora . Nasze wyniki: pokazują, że zmierzone programy C++ spędzają medianę w wysokości 5,2% swojego czasu i 3,7% swoich instrukcji w kodzie wysyłki. W przypadku wersji "wszystkich wirtualnych" , mediana kosztów ogólnych wzrasta do 13,7% (13% instrukcji). Wersja "thunk" implementacji tablicy funkcji wirtualnych zmniejsza narzut przez medianę 21% względem standardowej implementacji . Na przyszłe procesory te koszty ogólne mogą umiarkowanie
+1 dla miłego odniesienia. –
Nie zdziwiłbym się, gdyby optymalizacje kompilacji uczyniły te badania przestarzałymi. Został opublikowany w 1996. –
Um. Ale pytanie dotyczyło ___wirtualnego dziedziczenia___, a nie o ___wirtualnych funkcjach___. – sbi
- 1. C++ dziedziczenia wirtualnego
- 2. pytania o C++ dziedziczenia wirtualnego
- 3. C++ prywatny problem dziedziczenia wirtualnego
- 4. Wpływ układu WPF (Silverlight) Przekształcanie wydajności aplikacji
- 5. W jaki sposób można użyć static_cast w przypadku dziedziczenia wirtualnego?
- 6. Czy różne wirtualne implementacje dziedziczenia wirtualnego C++ są niezgodne?
- 7. C++: połączenie dwóch typów bez wirtualnego dziedziczenia klasy podstawowej
- 8. Wpływ wydajności używania write() zamiast send() podczas zapisywania do gniazda
- 9. Wpływ wydajności indeksowanego widoku w MS SQL Server 2008
- 10. Jaki jest wpływ wydajności wyłączania eager_load w production.rb?
- 11. Wpływ wydajności kombinacji "gorący" i "wbudowany" dla definicji funkcji
- 12. Wpływ wydajności używania map źródłowych css/javascript w produkcji?
- 13. Wpływ metod wirtualnych na wydajność
- 14. Javascript w katalogu wirtualnego nieświadomi katalogu wirtualnego
- 15. Tworzenie wirtualnego monitora/wirtualnego urządzenia wyświetlania
- 16. Wpływ Eventlistenerów?
- 17. Znaczniki a punkty wektorowe - wpływ na wydajność
- 18. Różnice między klasycznym dziedziczenia i prototypowego dziedziczenia
- 19. Które scenariusze maksymalizują wpływ wydajności wyższego rejestru w systemie x64 dla kodu C#?
- 20. Czy układ/kolejność tabel w klauzuli FROM ma wpływ na polepszenie wydajności?
- 21. Czy w jQuery występuje wpływ wydajności na używanie funkcji live zamiast bind?
- 22. Funkcje okna SQL: Wpływ wydajności na wielokrotne zwracanie tej samej wartości avg()?
- 23. Czy istnieje wpływ wydajności na zakres bloków w porównaniu z określaniem poziomu funkcji w .NET
- 24. Tworzenie wirtualnego urządzenia HID
- 25. tworzenie wirtualnego dysku twardego
- 26. Apache alias wirtualnego hosta
- 27. Dlaczego potrzebujemy wirtualnego stołu?
- 28. Wydajność wirtualnego interfejsu Boost.Variant Vs
- 29. Wpływ metody łańcuchowym
- 30. shuffle: wpływ sortowania
zwiększyć ile używasz wielokrotnego dziedziczenia, tak naprawdę nie ma potrzeby używać wirtualnego dziedziczenia. –
@ZacHowland, chyba że używasz szyderstwa z testem Google. (gtest) –
@Amigable: Nie ma "chyba". Podczas korzystania z Testu Google nadal dziedziczysz tylko dziedzicząc dziedzicząc wiele dziedzin. –