RaVo
RaVo
1
Ostatni przykład stąd: https://pl.wikibooks.org/wiki/C%2B%2B/Dziedziczenie_wielokrotne Te kilka bajtów to skąd się bierze?

W przykładzie poniżej rozmiar Klasy to 1kB + kilka bajtów, bez dziedziczenia wirtualnego byłoby to ponad 2kB, oraz oczywiście wywołanie metody wyswietl (używając takiego zapisu) byłoby niemożliwe.

#naukaprogramowania #cpp
  • Najlepsze
  • Wszystkie komentarze
inplaz
@RaVo: może vtable
wytrzzeszcz
@RaVo: pamiec potrzebna na "obsluge"?
rotflolmaomgeez
@RaVo: tak jak mówi @inplaz, chodzi o vtable do którego odnośnik jest na początku obiektu. Ale przy dziedziczeniu wirtualnym "na romb" są tworzone też ciekawsze struktury - w tym virtual table table ( ͡° ͜ʖ ͡°) zagadnienie jest obszerniejsze i różne kompilatory radzą sobie z tym na różny sposób, ale powyższy jest najpopularniejszy (g++, visual studio)
ly000
@RaVo: @inplaz: @wytrzzeszcz: @rotflolmaomgeez: przecież to nie jest vtable, bo nie ma tam żadnych metod wirutalnych. to jest tak jak powiedział @wytrzzeszcz pamięć potrzebna na obsługę tego mechanizmu. jest to zależne od implementacji kompilatora, ale zazwyczaj są dodawane 4 bajty (w x86) na wskaźnik na klasę bazową, gdyż w wirtualnym dziedziczeniu klasa bazowa nie zawsze musi być ulokowana przed klasą dziedziczącą i ten
rotflolmaomgeez
@ly000: i to zwykle *jest* realizowane przez vtable. Informacje w vtable nie ograniczają się wyłącznie do wskazywania funkcji wirtualnych.
ly000
@rotflolmaomgeez: wydaję mi się że według definicji vtable jest inaczej i że "virtual inheritance pointer" należy traktować jako inny, oddzielny mechanizm. możesz podać źródło definicji z jakiej korzystasz?
rotflolmaomgeez
@ly000: definicja to jedno, praktyka to drugie. G++ tworzy wtedy pustą tablicę funkcji wirtualnych i bezpośrednio przed tablicą ustawia offset danych klas - czyli to jak rozmieszczeni są rodzice w podklasie. Ale to dalej pointer na vtable i dalej jest to struktura tablicy wirtualnej.

Jak chcesz samemu popróbować to tu masz info jak: http://stackoverflow.com/questions/2549618/is-there-any-g-option-to-dump-class-layout-and-vtables

Pozdrawiam :)
ly000
G++ tworzy wtedy pustą tablicę funkcji wirtualnych i bezpośrednio przed tablicą ustawia offset danych klas - czyli to jak rozmieszczone są rodzice w podklasie


@rotflolmaomgeez: ustawia przed? w sensie że tworzy vip ("virtual inheritance pointer") przed vtable? z tego również wynika że to dwie różne rzeczy. nie mam g++, ale w debuggerze visual studio widzę że są tworzone dwa wskaźniki - __vfptr (vtable) i vip. jedno może istnieć bez drugiego,
rotflolmaomgeez
@ly000: w G++ vtable służy do przechowywania funkcji wirtualnych, typów obiektów i offsetów rodziców. Tylko że na początku jest typ, potem offsety, a potem funkcje wirtualne. Wskaźnik na początku utworzonego obiektu wskazuje na pierwszą funkcję wirtualną z vtable (taka optymalizacja, żeby zbyt dużo przesunięć nie wykonywać), więc vtable wtedy "wydaje się" pusta, ale tak naprawdę tylko nie ma żadnych funkcji wirtualnych, a typ obiektu i offsety rodziców są po prostu
rotflolmaomgeez
trochę sobie nie wyobrażam tej implementacji w g++. vtable jest jedno dla wszystkich instancji danej klasy, a vip dla każdej instancji jest inny.

@ly000: to bardzo proste, zamiast wskaźnika jest przechowywany offset względem początku obiektu. W ten sposób każda instancja otrzymuje "inny vip", ale relatywnie w pamięci offset jest taki sam względem instancji danego obiektu.