strigs immer 32 bytes groß?
-
Hallo ich habe eine Frage, ich bastel gerade mit Strings und mir ist aufgefallen dass ein String(string text = "...") in C++ immer nur 32 bytes groß sind auch wenn dort 200 Zeichen drin stehen.
Aber wie geht das? ich dachte ein string währe ein array aus Zeichen und der Computer müsste pro zeichen ein byte im RAM reservieren?
-
kleines Beispiel:
struct MyString { char* internalPointer; }; int main(int argc, char* argv[]) { MyString s; cout << sizeof(s) << "\n"; s.internalPointer = new char[100]; cout << sizeof(s) << "\n"; delete[] s.internalPointer; cout << sizeof(s) << "\n"; s.internalPointer = new char[argc]; cout << sizeof(s) << "\n"; delete[] s.internalPointer; return 0; }Na ... was wird wohl rauskommen ?

Gruß,
Simon2.
P.S. Kleiner Tipp: sizeof wird zur Compilezeit ausgwertet....
-
std::string speichert seine Daten auf dem Heap, deswegen kann er dynamisch wachsen.
Was du meinst sin char-arrayys:
char c[] = "Bla";
-
Aber im Heap ist doch auch nicht ungebrenz Speicher verfügbar.
@Simon2 übrall 4 laut dos-fenter ^^
-
Aber meist mehr als auf dem Stack.
-
der Pointer ist lediglich 4 byte groß
-
Du hast einen Pointer für einen String definiert, nicht mehr. Der ist für
32-bit-Anwendungen nun einmal 32 bit lang. Willst du einen String-Array, so
musst Du diesen als solchen deklarieren. Geht so, wie in der vorherigen Antwort.
Kannst auch anders machen:
char mystring[24]; // deklariert eine String für 24 Zeichen
strcpy(mystring,"blablabla"); // füllt was rein
Hinweis an C-Neulinge: Pointer sind wichtig, man sollte wissen was das ist!
-
Ja ich weiss was Pointer sind, die speichern die Adresse einer variable, aber um eine Speichern, muss es doch erstmal eine Variable geben.
-
@simon: delete [] ...
-
lord_fritte schrieb:
Ja ich weiss was Pointer sind, die speichern die Adresse einer variable, aber um eine Speichern, muss es doch erstmal eine Variable geben.
Etwas genauer:
char* internalPointer;
Ist eine Variable vom Typ char-Pointer. Diese hat (wie auch dein Programm richtig meldet) 32 bit auf 32 Bit-Systemen. Dies ist wie gesagt bereits eine Variable und diese Variable selbst liegt auf dem Stack. Der Inhalt wiederum ist eine Adresse auf einen Speicherbereich auf dem Heap. Du bekommst mit sizeof aber nur mitgeteilt wie groß die Variable (dein Pointer) ist.
internalPointer (4 Bit) -> Speicherbereich (z.b. dynamisch alloziert, internalPointer zeigt auf den Speicherbegin)
cu André
-
lord_fritte schrieb:
...@Simon2 übrall 4 laut dos-fenter ^^
Eben !

So ist's auch mit string: Die eigentlich "Daten" liegen nicht innerhalb des string-Objekts, sondern außerhalb.
(EIN Grund, warum ich gegen "direktes binäres Speichern" von Objekten in Files bin)(D)Evil schrieb:
@simon: delete [] ...
... hast natürlich Recht. Danke - hab's korrigiert.Gruß,
Simon2.
-
asc schrieb:
internalPointer (4 Bit) -> Speicherbereich (z.b. dynamisch alloziert, internalPointer zeigt auf den Speicherbegin)
Hier wird schonwieder feste Bit mit Byte verwechselt. Ein Zeiger ist niemals 4 Bit gross, das würde bedeuten dass man 16 Byte addressieren kann, selbst ein VC20 hatte grössere Zeiger.
Und wenn ein String Objekt wirklich 32 Byte gross ist(sizeof(std::string)), dann deutet das darauf hin dass die String Klasse SSO (small string optimization) verwendet. Dabei werden kurze Strings direkt im Objekt selbst gespeichert, wodurch die dynamische Speicheranforderung eingespart wird.
-
hustbaer schrieb:
Hier wird schonwieder feste Bit mit Byte verwechselt.
Sorry, muss ich im müden Zustand geschrieben haben ;p... Meinte Byte nicht Bit (Auch wenn ich zuhause tatsächlich ein System liegen habe das mit Nibbles [4 Bit] oder wie die heißen arbeitet, wenn auch nicht zur Adressierung).
cu André