"większa" klasa ma mniejszy rozmiar. Dziwne

0

Cześć :)
Z racji tego, że chciałbym "wychwycić" rozmiar wskaźnika VPTR robię różne doświadczenia na składowych klasy.
Ale nie idzie dojść do tego, jaki ma romiar VPTR. Dlaczego się nie ? Już tłumaczę:
sizeof dla tej klasy:

class X {
public:


    int a;

  virtual  void f() {
        cout << "X::f()\n";
    }

};
wynosi 16
a dla tej:
class X {
public:


    int a;
    int b;

  virtual  void f() {
        cout << "X::f()\n";
    }

};

też 16.
Czyli dodanie nowego pola int nie zwiększyło rozmiaru. Dlaczego?

2

Pewnie chodzi o wyrównanie (eng. alignment)

0

możesz dokładniej oraz czy możesz powiedziedzieć jak w takim razie przekonać się o wadze VPTR?

1

8

3

Tutaj masz opis... http://en.wikipedia.org/wiki/Data_structure_alignment
Nie rozumiem co masz na myśli pytając

jak w takim razie przekonać się o wadze VPTR?

To będzie jeden wskaźnik na VTABLE, czyli bedzie miał rozmiar taki jak wskaźnik (w zależności od platformy na jaką kompilujesz). Może chodzi Ci o rozmiar całej VTABLE - VTABLE jest jedna dla klasy, ale nie bardzo mam teraz pomysł jak sprawdzić jej rozmiar, a nie mam teraz czasu googlać.

0

Rozmiar VTABLE ściśle zależy od liczby metod wirtualnych w klasie, plus ewentualne dodatkowe śmieci...

Dokładny rozmiar nie jest raczej istotny, przecież VTABLE jest wspólna dla wszystkich obiektów danej klasy...

0

wszystko zależy od kompilatora i jego ustawień. Tak jak pisał @mychal wyrównywanie danych może powodować takie efekty.
z gcc na ideone wychodzi ok:
http://ideone.com/qkJPYS

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