Posiadanie co najmniej jednej metody wirtualnej w klasie C ++ (lub dowolnej z jej klas nadrzędnych) oznacza, że klasa będzie miała wirtualną tabelę, a każda instancja będzie miała wirtualny wskaźnik.
Więc koszt pamięci jest dość jasny. Najważniejszy jest koszt pamięci w instancjach (zwłaszcza jeśli instancje są małe, na przykład jeśli mają zawierać tylko liczbę całkowitą: w tym przypadku posiadanie wirtualnego wskaźnika w każdej instancji może podwoić rozmiar instancji. przestrzeń pamięci wykorzystywana przez wirtualne tabele, wydaje mi się, że jest zwykle pomijalna w porównaniu z miejscem zajmowanym przez rzeczywisty kod metody.
To prowadzi mnie do mojego pytania: czy istnieje wymierny koszt wydajności (tj. Wpływ na szybkość), aby uczynić metodę wirtualną? W tabeli wirtualnej będzie wyszukiwane w czasie wykonywania, przy każdym wywołaniu metody, więc jeśli są bardzo częste wywołania tej metody, a ta metoda jest bardzo krótka, to może wystąpić wymierny spadek wydajności? Myślę, że to zależy od platformy, ale czy ktoś przeprowadził jakieś testy porównawcze?
Pytam, ponieważ natknąłem się na błąd, który był spowodowany tym, że programista zapomniał zdefiniować metodę wirtualną. To nie pierwszy raz, kiedy widzę tego rodzaju błąd. I pomyślałem: dlaczego dodać słowa kluczowego wirtualnych, gdy są potrzebne, a nie usunięcie słowa kluczowego wirtualnych, gdy jesteśmy absolutnie pewni, że to jest nie potrzebne? Jeśli koszt wydajności jest niski, myślę, że po prostu zalecę w moim zespole: po prostu uczyń domyślnie każdą metodę wirtualną, w tym destruktor, w każdej klasie i usuwaj ją tylko wtedy, gdy zajdzie taka potrzeba. Czy to brzmi dla ciebie szalenie?