Frage zur Speicherbelegung eines Strings



  • Hallo zusammen,
    mein Buch sagt: "Ein String benötigt deshalb ein Byte mehr Speicherplatz als die Anzahl der Zeichen, die er enthält. Der leere String "" belegt genau ein Byte."

    Nun habe ich folgendes geschrieben:

    #include <string>
    ...
    string zeichenkette="";
    cout << sizeof(zeichenkette);
    

    Warum wird nun 32 ausgegeben? Egal wie viel in zeichenkette steht, die Größe bleibt konstant auf 32 Byte! Warum?

    Vielen Dank
    lg, freakC++



  • Der string belegt mindestens einen Zeiger, also 4 Bytes und der zeigt auf wo im Freispeicher, das belegt auf Win mindestens 32 Bytes.
    Was der Autor meint, sind wohl character-arrays, was die normale Darstellung für Strings ist und so direkt nix mit der Klasse string zu tun hat.
    Machmal

    char bla[]="hallo";
    cout<<sizeof(bla)<<'\n';
    

    Ich könnte mir denken, daß das Buch jetzt stimmt.



  • Hallo,
    ich habe das mal ausprobiert und es stimmt! Wenn man über strings redet, dann denke ich auch an string und nicht an chars...naja!

    Vielen Dank für den Tipp!

    lg, freakC++



  • freakC++ schrieb:

    Wenn man über strings redet, dann denke ich auch an string und nicht an chars...naja!

    Ein String ist eine Zeichenkette. Ob man damit std::string, ein char-Array, CString, AnsiString oder sonstwas meint, ist rein aus der Bezeichnung ja erst mal nicht ersichtlich.



  • Ja, da hast du natürlich recht. Ich sollte es mir abgewöhnen 😉

    Vielen Dank
    lg, freakC++



  • Und noch ein Hinweis, warum bei std::string bei einigen Implementierungen mehr als ein Zeiger sowie die Länge abspeichert wird. Für kleine Zeichenketten werden diese dann direkt im std::string-Objekt abgelegt (anstatt per new Freispeicher anzufordern), d.h. intern gibt es dann z.B. einen char[16]-Puffer (erst bei Strings mit mehr als 15 Zeichen - eines weniger, wegen dem Nullendezeichen - wird die zeitaufwändigere Freispeicherallokation aufgerufen).



  • freakC++ schrieb:

    Nun habe ich folgendes geschrieben:

    #include <string>
    ...
    string zeichenkette="";
    cout << sizeof(zeichenkette);
    

    Davon abgesehen: sizeof würde ich im Zusammenhang mit Klassen mit Vorsicht geniesen (ober anders herum: denk daran das sizeof nur die eigentliche Größe liefert, nicht aber den Speicherbereich auf den Zeiger verweisen)...

    Probier mal aus was sizeof zurückgibt wenn du einen langen String in "zeichenkette" schreibst und denk dabei an obigen Hinweis.



  • DAnn wird auch 32 ausgegeben....ja, ich denke, dass ich wohl die Bedeutung von sizeof falsch verstanden habe...

    Vielen Dank für eure Hilfe.
    lg, freakC++


Anmelden zum Antworten