Rozmar klasy

0

Witam,

mam dosc proste pytanie:
Dlaczego rozmiar klasy w bajtach nie zwieksza sie gdy zadeklarujemy w niej metode? czy klasa nie musi posiadac chociazby adresu do tej funkcji?
przykladowy kod:

class C
{
 float bla;               //zwieksza rozmiar
 int *ptr;                //zwieksza rozmiar
 int (*prt_f)(int);   //zwieksza rozmiar
 int f()                   //nie zwieksza DLACZEGO??
 {bool a;}
};

 int _tmain(int argc, _TCHAR* argv[])
{
	std::cout<<sizeof(C)<<std::endl; //wynik 12
	C c;
        std::cout<<sizeof(c);                   //12
	return 0;
}

I moje drugie pytanie:
Dlaczego rozmiar klasy pustej rowna sie 1?? Jak zapewne zauwazyliscie uzywam VC.

0

liczysz rozmiar obiektu danej klasy, a każdy obiekt przechowuje dane, a nie funkcje :P Więc wszelkie zmienne składowe składają się na rozmiar obiektów danej klasy, a metody nie.

0

W pierwszym cout'cie licze rozmiar klasy a nie obiektu.

0

widocznie sizeof zwaraca rozmiar obiektów jakie powstaną z danej klasy :P Mało byłby przydatny jakby zwracał inną wartoś niż w przypadku samych obiektów :P

0

Ok, ok nie zmienia to jednak faktu ze obiekt czy klasa musi znac co najmniej adresy funkcji skladowych zeby moc je wywolac.

Pozostaje drugie moje pytanie,dlaczego pusta klasa(jak i instancja) ma rozmiar 1 a nie 0?

0

Jakby było zero, to nie mógłbyś zrobić tablicy obiektów takiej klasy.

Ok, ok nie zmienia to jednak faktu ze obiekt czy klasa musi znac co najmniej adresy funkcji skladowych zeby moc je wywolac.

Nie, to kompilator musi je znać.

0

O, dobre, na to nie wpadlem ;- )
Danke

0

Tytanowy Janusz ma czesciowo racje, ale tylko czesciowo. w przypadku klas zwyklych - dokladnie tak, wystarczy ze kompilator zna te adresy. po skompilowaniu, obiekty sa totalnie nieswiadome czym sa. Ale, jesli mowa o klasach z funkcjami wirtualnymi sprawa ma sie inaczej. kazdy obiekt klasy z takimi metodami zawiera dodatkowa infomacje na temat tychze metod, a konkretnie wskaznik na tzw. vtable. tzn:

class X{ int x; int metoda(); } - sizeof() == sizeof(int)
class Y{ int y; virtual int metoda(); } - sizeof() = sizeof(int) + sizeof(void*)

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