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? Objekt wird wohl mindestens einen virtuellen Destruktor haben, also hat die Klasse eine VMT und die Objekte brauchen eine VMT-Referenz, das kostet sizeof(void*) . Und std::string verwendet vermutlich die Small String Optimization und hat deswegen sizeof(void*) + sizeof(small string buffer) .



  • Bisschen zu voreilig geposted.. sizeof(std::string) sind 28 Bytes mit dem void* der VMT kommt man auf 32B.


Anmelden zum Antworten