STL String sizeof



  • Hallo,

    sizeof liefert in folgendem Falle 4 Byte:

    string s;
    sizeof(s);

    Da war ich verwundert, weil in meinem naiven Weltbild sah die Sache so aus:
    sizeof liefert die Größe von einem Zeichen. Somit hätte ich gedacht, dass ich bei sizeof(string) 1 Byte erhalte, und bei sizeof(stringw) 4 Byte.

    Warum sizeof(string) 4 Byte liefert, verstehe ich aber nicht.
    Selbst sizeof(basic_string<char>) liefert 4 Byte.

    Kann mir das jmd. erklären?



  • StringDoktor schrieb:

    Da war ich verwundert, weil in meinem naiven Weltbild sah die Sache so aus:
    sizeof liefert die Größe von einem Zeichen.

    Nein, sizeof liefert die Größe des Typs. Und je nach Implementierung kann dies unterschiedlich sein. Denk bitte daran das string (bzw. basic_string<char>) eine Klasse ist, und nicht einfach ein char (bzw. char*).



  • Ok danke, was mich aber noch gewundert hat:
    Theoretisch müsste string, oder basic_string<char> pro Zeichen nur ein Byte verwenden, womit 255 verschiedene Zeichen möglich wären.
    wstring speichert ja dagegen 32-Bit-Werte und ist somit brauchbar für Unicode-Zeichen.

    In einem kleinen Beispiel habe ich von der Konsole einen Wert eingelesen und in einem normalen String gespeichert:

    string s;
       cin >> s;
       cout << s;
    

    Beim Ausführen habe ich nun mehrere kyrillische Zeichen, das Währungszeichen für den Euro und ein paar deutsche Umlaute und Buchstaben eingegeben, mit der Annahme, dass der string einige Werte nicht korrekt speichern wird (da nur 255 Zeichenmöglichkeiten bei Byte), und die Buchstaben je nach eingestellter Codepage in der Konsole verfälscht werden würden.
    Zu meinem Erstaunen hat meine Linux-Konsole jedoch alle Zeichen wieder korrekt ausgegeben.
    Okay, ich habe zwar eine Unicode-Konsole eingestellt, aber dennoch dürften die Zeichenwerte in einem einfachen string ja garnicht erst alle Platz finden, oder irre ich mich?



  • UTF-8?



  • Vergleiche die Länge des Strings mit der Anzahl der Zeichen die du eingegeben hast.



  • Eingegeben: 11 Zeichen
    .size() liefert: 21 Zeichen

    Achsoo, jetzt verstehe ich das glaube ich: Er kann zwar sehr wohl die Unicode-Zeichen korrekt einspeichern, aber die vorhandenen string-Funktionen können nicht richtig damit umgehen, stimmt das?

    Also wäre das Unicode-Problem mit wstring im Prinzip behoben, abgesehen von der Tatsache, dass 4 Byte pro Zeichen verbraten werden.



  • StringDoktor schrieb:

    wstring speichert ja dagegen 32-Bit-Werte

    Nope. std::wstring speichert Zeichen des Typs wchar_t. Und dessen Wertebereich ist implementationsspezifisch und muss lediglich einem der anderen ganzzahligen Typen entsprechen. Unter Linux ist wchar_t afaik 32 Bit breit, unter Windows hingegen 16 Bit.



  • Ich weiß nicht, ob das schon klargeworden ist:

    sizeof() liefert die zur Compile-Zeit bekannte Größe, die sich aus Datenmembern, Padding, VMT u.a. zusammensetzt.

    sizeof(int 😉 ist auf einer Platform immer gleich groß, egal wieviel Speicher dafür alloziert ist.

    Für std::string gibt es sehr unterschiedliche Implementationen, Zumindest die Größe eines Zeigers.


Anmelden zum Antworten