Eigenes Speichermanagement
-
Folgendes Szenario: Ich habe eine Oberklasse, die das Speichermanagement verwalten soll. U.a ist der Operator new überladen und ruft mit der aktuellen Implementation eigentlich nur den Standardoperator auf:
static void *operator new(size_t size){ std::cout << "new aufgerufen. size= " << size << std::endl; return ::operator new(size); }Die Unterklasse ist simpel aufgebaut und verfügt nur über ein privates Attribut vom Typ string:
class Person : public Objekt { public: Person(const std::string& n = "N.N") :name(n) {} ~Person() { std::cout << "Person Destruktor aufgerufen(" << name << ")" << std::endl; } const std::string& getName() const { return name; } private: std::string name; };Die Anweisung
Person* ptr1 = new Person("SeppJot");gibt mir für size == 32 aus. Wie zur Hölle kann sizeof(Person) == 32 sein?
-
Warum nicht?
Objektwird wohl mindestens einen virtuellen Destruktor haben, also hat die Klasse eine VMT und die Objekte brauchen eine VMT-Referenz, das kostetsizeof(void*). Undstd::stringverwendet vermutlich die Small String Optimization und hat deswegensizeof(void*) + sizeof(small string buffer).
-
Bisschen zu voreilig geposted.. sizeof(std::string) sind 28 Bytes mit dem void* der VMT kommt man auf 32B.