Czesć,
W swoim programi mam klasę Triangle. Wygodnie mi jest, żeby implementowała ona dwa interfejsy: IRenderable oraz IShape. Interfejs, to po prostu zwykła struktura, ale bez żadnych danych i każda jej metoda jest czysto wirtualna. Poniżej uproszczona wersja kodu:
struct IShape
{
virtual bool Intersects(Ray r)=0;
};
struct IRenderable
{
virtual Color GetColor(Vector3 p)=0;
};
struct Triangle:public IRenderable,public IShape
{
Vector3 v1,v2,v3; //3*12=36 bytes
virtual bool Intersects(Ray r) {...}
virtual Color GetColor(Vector3 p) {...}
};
Obiektów klasy Triangle mam w jednym czasie bardzo dużo (rzedu kilkuset tysięcy), więc chciałbym, żeby zajmowały jak najmniej miejsca w pamięci. Sądziłem, że jeśli IShape i IRenderable są interfejsami i nie mają żadnych pól, to w obiektach klasy Triangle, nie są potrzebne dwa wskaźniki na vtable i wystarczy tylko jeden. Gdzieś o tym kiedyś czytałem. Niestety okazało się, że poniższy kod:
Triangle* triangle=new Triangle();
cout<<"sizeof(*triangle) = \t"<<sizeof(*triangle)<<endl;
wypisuje u mnie 44. 36 bajtów zajmują pola. Wchodzi na to, że pozostałe 8 bajtów zajmują 2 wskaźniki na vtable.
Nie wiem, może mi się po prostu wydawało, że wystarczy 1 wskaźnik. jeśli tak, to do czego potrzebne są oba?
Sprawdzałem to na MSVC++ 2008.