Załóżmy, że klasa ma żadnych danych:Wielkość klasy podstawowej klasy środka pochodzącego
struct Empty {
/*some methods here*/
};
I klasy pochodnej
struct Derived: Empty {
int a;
int b;
char c;
....
}__attribute__((packed));`
obiektów pustych grupy mają wielkość = 1. Pusty element klasy uzyskanego zwykle ma 0 rozmiar. Jak rozumiem kompilator, zobacz, że klasa Base Empty nie ma żadnych danych, więc może zoptymalizować rozmiar Empty w przypadku, gdy jest "w środku" Pochodnym, ale nie jest to wymagane przez standard.
Więc pytanie brzmi:
można jakoś określić w czasie kompilacji, które Empty część pochodnych klasy naprawdę nie zajmują pamięci.
Rozumiem, że mogę sprawdzić np. sizeof(Derived) = sizeof(a) + sizeof(b) ...
Ale jest zbyt szczegółowe i istnieje kilka klas takich jak pochodne. Czy istnieje bardziej eleganckie rozwiązanie?
Dlaczego chcesz to wiedzieć? Zauważ, że element członkowski lub klasa podstawowa może zajmować pamięć bez dodawania do footprintu klasy pochodnej (przez użycie spacji zagubionej do dopełnienia). Zauważ też, że 'sizeof' na struct może być mniejszy lub większy niż suma' sizeof' tego elementu i zasad. – skyking
Mam zamiar użyć tych klas pochodnych do reprezentowania niektórych danych sieciowych. Więc wszystkie takie klasy pochodne będą miały atrybut spakowany. Przejdę również do dziedziczenia z jakiejś klasy szablonów, aby zaimplementować Ciekawe powtarzające się wzorce szablonów. Aby wszystkie klasy pochodne miały pewną wspólną funkcjonalność. Jednak nie chcę, aby to dziedzictwo miało wpływ na układ klas pochodnych. –