Wpis z mikrobloga

@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)
  • Odpowiedz
@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
  • Odpowiedz
@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?
  • Odpowiedz
@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 :)
  • Odpowiedz
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,
  • Odpowiedz
@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
  • Odpowiedz
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.
  • Odpowiedz