Die Größe eines std::string Objekts in Byte?



  • Hallo liebe Community,

    ich beschäftige mich erst seit kurzer Zeit mit der Programmierung mit C++ und deshalb verzeiht mir bitte meine simple Frage.

    In der Uni habe ich eine Aufgabenblatt mit folgender Teilaufgabe bekommen:

    Eine Variable ist als
    string s = "Hallo, \nWelt!";
    definiert.
    Welchen Wert gibt die Funktion sizeof(s) zurück?

    Vermutlich ist std::string gemeint. Da string ein Klassenobjekt ist, vermute ich dass sizeof die Anzahl Bytes aller Datenmember der Klasse string zurückgibt. Woher soll ich die kennen? Wenn ich das Programm compiliere, dann gibt sizeof(s) die Zahl 4 zurück. Ich kann mir nicht erklären, wie man ohne sich den Header von string anzuschauen auf 4 Byte kommt.

    Freue mich über Antworten.

    Mfg, Thomjay



  • Thomjay92 schrieb:

    Hallo liebe Community,

    ich beschäftige mich erst seit kurzer Zeit mit der Programmierung mit C++ und deshalb verzeiht mir bitte meine simple Frage.

    In der Uni habe ich eine Aufgabenblatt mit folgender Teilaufgabe bekommen:

    Eine Variable ist als
    string s = "Hallo, \nWelt!";
    definiert.
    Welchen Wert gibt die Funktion sizeof(s) zurück?

    Vermutlich ist std::string gemeint. Da string ein Klassenobjekt ist, vermute ich dass sizeof die Anzahl Bytes aller Datenmember der Klasse string zurückgibt. Woher soll ich die kennen? Wenn ich das Programm compiliere, dann gibt sizeof(s) die Zahl 4 zurück. Ich kann mir nicht erklären, wie man ohne sich den Header von string anzuschauen auf 4 Byte kommt.

    Freue mich über Antworten.

    Mfg, Thomjay

    Kann man auch nicht.
    4 ist wenig. Andere haben auch 8, 16, 12, 24 oder irgendwas. Kommt ganz auf den Compiler und seine Implementiertung der standardlib an.

    4 scheint mir echt ungewöhnlich, anscheinend nur ein Pointer auf eine private string_rep.



  • Ohne den Header zu lesen oder ausprobieren geht es nicht. sizeof(s) ist auch keine Funktion. Ich denke, die Aufgabe ist im Prinzip sinnvoll, um eventuell die Vorstellung auszuräumen, dass sizeof irgendwie die Länge des Strings wiedergibt. Allerdings ist sie blöd gestellt.



  • Thomjay92 schrieb:

    Wenn ich das Programm compiliere, dann gibt sizeof(s) die Zahl 4 zurück. Ich kann mir nicht erklären, wie man ohne sich den Header von string anzuschauen auf 4 Byte kommt.

    Vielleicht ist das genau die gesuchte Antwort?


  • Mod

    Das ist eine völlig bescheuerte Aufgabe, da sizeof(s) auf verschiedenen Plattformen und Implementierungen völlig verschiedene Werte liefern kann. Die Aufgabe hört sich nämlich so an, als würde ein bestimmter Wert erwartet werden.

    vermute ich dass sizeof die Anzahl Bytes aller Datenmember der Klasse string zurückgibt.

    Und Basisklassen.

    Ich kann mir nicht erklären, wie man ohne sich den Header von string anzuschauen auf 4 Byte kommt.

    In dem du cout << sizeof(string); schreibst. Vielleicht wollen sie lediglich, dass du es bei dir ausführst und irgendeinen Wert notierst, den dir dein Compiler ausspuckt.

    Bei Vier Bytes wird wohl ein Zeiger auf die eigentlichen Member vorhanden sein, sonst kann ich mir das nicht erklären.

    Edit: Verdammt spät!



  • Vielleichst stellt sich der Fragesteller vor, daß std::string schlicht ein Warpper um strcpy/strlen/strcat ist und daher sinnvollerweise nur einen Zeiger hat.

    Bei mir ists wieder nur ein Zeiger. gcc 4.8.2. Aber ein Zeiger auf hanz komische Sachen,

    struct _Rep_base
          {
    	size_type		_M_length;
    	size_type		_M_capacity;
    	_Atomic_word		_M_refcount;
          };
    

    Aha, Länge, Kapazität und refcount können alle.

    struct _Rep : _Rep_base
          {
            static size_type _S_empty_rep_storage[];
    

    Aha, und ein Array unbestimmter Größe drangeflanscht, GCC-Erweiterung.

    CopyOnWrite ohne zusätzliche Indirektion, die sind ja cool drauf.



  • Vielen Dank für die schnellen Antworten!
    Schade, dass man einem Objekt von außen nicht ansieht, wie groß es ist -.-
    Das war eine Aufgabe aus einer Altklausur, na super...

    Mfg, Thomjay


  • Mod

    Aha, und ein Array unbestimmter Größe drangeflanscht, GCC-Erweiterung.

    Das ist doch keine Erweiterung? Das Array ist statisch, daher darf man es mit unbekannter Größe deklarieren und später den Typ vervollständigen.



  • Arcoth schrieb:

    Aha, und ein Array unbestimmter Größe drangeflanscht, GCC-Erweiterung.

    Das ist doch keine Erweiterung? Das Array ist statisch, daher darf man es mit unbekannter Größe deklarieren und später den Typ vervollständigen.

    Ups, ja, lesen müsst man können. Hab das static voll übersehen.

    Oben stehts

    *  Documentation?  What's that?
       *  Nathan Myers <ncm@cantrip.org>.
       *
       *  A string looks like this:
       *
       *  @code
       *                                        [_Rep]
       *                                        _M_length
       *   [basic_string<char_type>]            _M_capacity
       *   _M_dataplus                          _M_refcount
       *   _M_p ---------------->               unnamed array of char_type
       *  @endcode
       *
       *  Where the _M_p points to the first character in the string, and
       *  you cast it to a pointer-to-_Rep and subtract 1 to get a
       *  pointer to the header.
       *
       *  This approach has the enormous advantage that a string object
       *  requires only one allocation.  All the ugliness is confined
       *  within a single %pair of inline functions, which each compile to
       *  a single @a add instruction: _Rep::_M_data(), and
       *  string::_M_rep(); and the allocation function which gets a
       *  block of raw bytes and with room enough and constructs a _Rep
       *  object at the front.
       *
       *  The reason you want _M_data pointing to the character %array and
       *  not the _Rep is so that the debugger can see the string
       *  contents. (Probably we should add a non-inline member to get
       *  the _Rep for the debugger to use, so users can check the actual
       *  string length.)
       *
       *  Note that the _Rep object is a POD so that you can have a
       *  static <em>empty string</em> _Rep object already @a constructed before
       *  static constructors have run.  The reference-count encoding is
       *  chosen so that a 0 indicates one reference, so you never try to
       *  destroy the empty-string _Rep object.
       *
       *  All but the last paragraph is considered pretty conventional
       *  for a C++ string implementation.
    


  • Thomjay92 schrieb:

    Schade, dass man einem Objekt von außen nicht ansieht, wie groß es ist -.-

    Doch mit sizeof . Und vielleicht ist die gesuchte Antwort: Fuer jedes Objekt einer Klasse die gleiche Konstante.

    Das Array ist statisch, daher darf man es mit unbekannter Größe deklarieren und später den Typ vervollständigen.

    Und ich dachte es ist nur 'ne andere Schreibweise fuer einen Pointer.


Anmelden zum Antworten