String - Ausgabe funktioniert nicht bzw. verschiedene Kapazität und Länge eines Strings



  • Hallo liebe Gemeinde.

    Ich hätte ein paar Fragen zu einem Beispiel aus der C++ Reference.

    Hier einmal der Beispielcode:

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main()
    {
    	string str ("Test string");
    
    	cout << "Groesse:		" << str.size() << "\n";
    	cout << "Laenge:		" << str.length() << "\n";
    	cout << "Kapazität:		" << str.capacity() << "\n";
    	cout << "Max. Groesse:  " << str.max_size() << "\n";
    
    	return 0;
    }
    

    1. Frage:
    Wenn ich auf "Starten ohne Debugging" klicke, erscheint bei meiner Ausgabe die Meldung

    Der Befehl "D:...\Eigene Übung 107 - String vergleichen Länge, usw.exe" ist entweder falsch geschrieben oder konnte nicht gefunden werden."
    
    Woran kann das liegen?
    
    2. Frage:
    Im Beispiel selber auf C++ Reference soll folgendes ausgegeben werden:
    [cpp]
    size: 11
    length: 11
    capacity: 15
    max_size: 4294967291
    

    Woran liegt das, dass size und length andere Werte haben als capacity und max_size ??
    Ich dachte, dass capacity wegen der '\0 den Wert 12 hat?? Wo liegt mein Denkfeher?

    Danke für die Antworten im Voraus.

    Gruß

    Max



  • max_size ist die größte Länge die ein String jemals haben kann. capacity ist größer als size, weil der String mehr Speicher im Voraus reserviert, damit er möglichst selten etwas neu reservieren und kopieren muss falls etwas hinten dran gehängt wird.



  • ...



  • Wenn ich auf "Starten ohne Debugging" klicke, erscheint bei meiner Ausgabe die Meldung

    Der Befehl "D:...\Eigene Übung 107 - String vergleichen Länge, usw.exe" ist entweder falsch geschrieben oder konnte nicht gefunden werden."

    *facepalm*

    Ich dachte, dass capacity wegen der '\0 den Wert 12 hat?? Wo liegt mein Denkfeher?

    capacity() liefert die maximale Länge, die der String annehmen kann ohne neuen Speicher allokieren zu müssen.
    Wie groß das Verhältnis capacity() / length() ist, hängt von der Implementierung ab.
    Bei dir scheint es wohl 5/4 zu sein.

    Edit: Och.. zu spät. Keks, wieso bist du so schnell oO



  • wofür ist max_size eigentlich gut?
    und woher kommt diese zahl?

    auf mich macht das en bisschen den eindruck einer kristallkugel (ok, die zahl selbst ist ja 2^32 - 1, also 4GB in bytes)



  • Der Wert ist dafür da, dass du eben keine Kristallkugel brauchst um festzustellen wir groß ein string maximal werden kann.

    Das ist Systemabhängig.



  • aber da dann konstant?



  • Sone schrieb:

    Ich dachte, dass capacity wegen der '\0 den Wert 12 hat?? Wo liegt mein Denkfeher?

    capacity() liefert die maximale Länge, die der String annehmen kann ohne neuen Speicher allokieren zu müssen.
    Wie groß das Verhältnis capacity() / length() ist, hängt von der Implementierung ab.
    Bei dir scheint es wohl 5/4 zu sein.

    Strings bis Länge 15 werden bei Visual C++ ohne dynamische Speicheranforderung im Objekt selbst abgelegt.



  • TyRoXx schrieb:

    Sone schrieb:

    Ich dachte, dass capacity wegen der '\0 den Wert 12 hat?? Wo liegt mein Denkfeher?

    capacity() liefert die maximale Länge, die der String annehmen kann ohne neuen Speicher allokieren zu müssen.
    Wie groß das Verhältnis capacity() / length() ist, hängt von der Implementierung ab.
    Bei dir scheint es wohl 5/4 zu sein.

    Strings bis Länge 15 werden bei Visual C++ ohne dynamische Speicheranforderung im Objekt selbst abgelegt.

    Gut, das ist alles implementationsabhängig. Stimmt, die meisten Compiler allokieren sehr kleine Strings vom Stack... :xmas2:



  • Ich dachte, dass capacity wegen der '\0 den Wert 12 hat?? Wo liegt mein Denkfeher?

    @silent_max: Was hat des den mit der '\0 zu tun? Glaubst du, dass das im string steht?



  • Sone schrieb:

    [...] die meisten Compiler allokieren sehr kleine Strings vom Stack...

    Das klingt so, als würden die statt new oder malloc dann alloca verwenden. Ich bin dafür, dass man nicht immer "Stack" sagt, wenn man nur meint, dass man Daten direkt im Objekt statt sonstwo ablegt. Es heißt übrigengs auch "allozieren" und nicht "allokieren".



  • krümelkacker schrieb:

    Sone schrieb:

    [...] die meisten Compiler allokieren sehr kleine Strings vom Stack...

    Das klingt so, als würden die statt new oder malloc dann alloca verwenden.

    Für mich klingt das so als würde das ganze implementationsspezifisch ablaufen.
    Ob dann alloca verwendet wird oder nicht ist doch völlig irrelevant.

    Ich bin dafür, dass man nicht immer "Stack" sagt, wenn man nur meint, dass man Daten direkt im Objekt statt sonstwo ablegt.

    Du hast vollkommmen Recht, sry.
    Ein basic_string<> kann schließlich auch Feldelement eines Containers o. ä. sein, dann liegt gar nichts mehr von dem String noch im Stack 😃

    Übrigens, was das "sprachliche" angeht:

    <a href= schrieb:

    Wikipedia">Das zugehörige Verb lautet allozieren. In der Informatik wird zunehmend häufiger auch das Verb allokieren verwendet, das direkt vom englischen „allocate“ abgeleitet wurde. Der Rechtschreibduden enthält diese letztere Schreibweise nicht.

    Ich bin ein deutlicher Befürworter des Anglizismus. 😉



  • ...



  • Swordfish schrieb:

    Sone schrieb:

    Übrigens, was das "sprachliche" angeht:

    <a href= schrieb:

    Wikipedia">[...] allokieren [...] das direkt vom englischen „allocate“ abgeleitet wurde. [...]

    Ich bin ein deutlicher Befürworter des Anglizismus. 😉

    Zweifelhaft. allocare.

    Daran ist nichts zweifelhaft. Hättest du mal die Seite besucht, die du verlinkst, hättest du herausgefunden dass die sprachliche Bedeutung von allocate in der Informatik mit der von allocare nichts zu tun hat.



  • Das beantwortet nur eine meiner beiden Fragen.

    Ich bin immer noch nicht auf eine Lösung gestoßen, warum bei mir in der Ausgabe die Meldung D:\...\Eigene Übung 107 - String vergleichen, Länge, usw.ext ist entweder falsch geschrieben oder konnte nicht gefunden werden . Oder habt ihr wegen der Meldung den Einwurf mit der Glaskugel gemacht??

    Gruß



  • Woran liegt das, dass size und length andere Werte haben als capacity und max_size?

    Weil es unterschiedliche Dinge sind!

    warum bei mir in der Ausgabe die Meldung ...

    Wie ware es, wenn du keine Leerzeichen oder sonstige Sonderzeichen verwendest?



  • ...



  • Swordfish schrieb:

    Sone schrieb:

    Hättest du mal die Seite besucht, die du verlinkst, hättest du herausgefunden dass die sprachliche Bedeutung von allocate in der Informatik mit der von allocare nichts zu tun hat.

    Wiktionary schrieb:

    allocare [...] mittellateinisch: mieten

    Ja ne, is klar. 🙄

    Es tut mir Leid.
    Wieso stellt Wikimedia (bzw. die Nutzer) widersprüchliche Informationen ins Netz? Sry, mein fehler:

    <a href= schrieb:

    Das Wiktionary">Herkunft:
    zu mittellateinisch allocare

    😕

    Ich bin immer noch fest überzeugt, dass allokieren aus dem Englischen abgeleitet ist, schließlich ist die Sprache der Informatik Englisch und die informationstechnische Begrifflichkeit hat mit Latein nichts am Hut.



  • ...



  • Swordfish schrieb:

    Sone schrieb:

    Ich bin immer noch fest überzeugt, dass allokieren aus dem Englischen abgeleitet ist, schließlich ist die Sprache der Informatik Englisch und die informationstechnische Begrifflichkeit hat mit Latein nichts am Hut.

    Und wo meinst hat die englische Sprache das Wort her? allocate 🙄

    Dein 🙄 kannst du dir sparen, denn es ist völlig egal wovon die Englische Sprache allocate abgeleitet hat. Es geht nur darum, wovon allokieren direkt abgeleitet ist.
    (Das allocate von allocare abgeleitet ist hatte ich btw. schon vor dir gefunden. lol)



  • ...


Anmelden zum Antworten