[C++] i wydajność funkcji wirtualnych

0

Witam
Czy ma ktoś jakieś dane na temat jak bardzo funkcje wirtualne wpływają na wydajność? Mam taką sytuację, że bardzo wyogdnie byłoby użyć funkcji wirtualnych ale nie wiem czy to się opłaci pod koątem wydajności. Funkcje, które chcę uczynić wirtualnymi będe wywoływał kilkatysięcy razy pod rząd. Czy w takim razie jest tego używać?

0

Funkcje wirtualne są minimalnie wolniejsze - zwykłe metody są zapisane bezpośrednio w 'strukturze' klasy i wywoływane przez wskaźnik lub nawet bezpośrednio jak zwykłe funkcje /zlinkwane statycznie/, wirtualne zaś wymagają odczytania wskaźnika do tablicy metod wirtualnych i wywołania odczytanego stąd adresu. W praktyce jest to różnica na poziomie 1-2 instrukcji kodu maszynowego w porównaniu do 'zwykłych' metod. Jeżeli chodzi o polimorfizm czy interface'y to jest to najszybsza metoda. Jeżeli zastosowanie zwykłych metod wymaga chociaż linijki kodu więcej przy ich wywoływaniu to najprawdopodobniej metody wirtualne będą szybsze... W praktyce lepiej sprawdzić to doświadczalnie - teoria teorią, wszystko zależy jak kompilator to rozwiąże w praktyce. W każdym razie dynamic_cast to moim zdaniem pomyłka w szczególności jeżeli chodzi o wydajność.

0

I nie można zapominać, że kompilatory C++ z reguły i tak linkują funkcje statycznie wszędzie gdzie tylko się da. A linkowanie dynamiczne dają tylko tam, gdzie to koniecznie potrzebne. Więc bardzo często okazuje się, że różnice w wydajności są marginalne. W zasadzie jeśli zależy ci na wydajności, to musisz uważać jedynie z tzw. dziedziczeniem wirtualnym:

class A: public virtual X { ... };

Ale tego i tak się rzadko używa. (a z funkcjami wirtualnymi to ma wspólną tylko nazwę ;) )

0

Cała 'wirtualność' jest zaimplementowana w C++ bodajże na 4 wskaźnikach. Przy dzisiejszych osiągach komputerów raczej nie szczypałbym się. Chyba, że chodzi kod naprawdę optymalny...

0

Dzięki za odpowiedzi
Pozdrawiam

0

Jeszcze dodam, że testowałem dwie wersje z funkcjami wirtualnymi i bez i żadnej różnicy nie odczułem. Inna rzecz mnie zdziwiła - widać różnice w wydajności między użyciem gołego vectora a z obudową stack. Niby nie duża ale zawsze. Druga sprawa to że, gdy próbowałem zerzerowować pamięć vectora metodą reserve działało wolniej niż bez reserve. Ktoś potrafi takie zachowanie wytłumaczyć?

1 użytkowników online, w tym zalogowanych: 0, gości: 1