char array vs. string



  • Moin!
    Hat char array gegenüber string irgendwelche Vorteile?



  • Hi,

    die .exe ist bei mir um 8Kb kleiner. Bei

    int main()
    {  char x[]="Hallo";
       return 0;
    }
    

    gegenüber

    #include <string>
    int main()
    {  std::string x="Hallo";
       return 0;
    }
    

    🤡 🤡 🤡 🤡 🤡

    nein, hat in meinen Augen keine Vorteile

    grüße Con@n



  • hi,
    ich denke, dass man den std::string dem char array vorziehen sollte, da er nicht so fehleranfällig und einfacher zuhandhaben ist.
    Und wenn man unbedingt ein char array braucht, gibt es ja immer noch die Funktion c_str().

    Tschau Gartenzwerg



  • Ebend, string ist OOP, während ein char-Array... naja, wenn man jetzt noch Funktionen wie strcpy etc. dazuzieht ist es halt C.

    Für größere Projekte macht das viel Sinn, weil es besser aussieht, außerdem kann man strings schön einfach in Funktionen als Rückgabetyp festlegen, was mit char* nur über die Parameter funktioniert.
    Wer C++ programmiert, sollte meiner Meinung nach auch string nehmen, C-Arrays sind C.

    MfG MAV



  • herrlado schrieb:

    Moin!
    Hat char array gegenüber string irgendwelche Vorteile?

    Auf anhieb fällt mir ein:

    Es verbraucht nur die Größe der Nutzdaten + 1 Byte (Nullzeichen)
    Ist implementierungsunabhängig (z.B. DLL Schnittstelle)



  • char array ist schneller



  • YHBT schrieb:

    char array ist schneller

    ...in bestimmten Situationen (Z.B. für den Fall, dass der String nie verändert wird und seine länge bereits zur Compile-Zeit bekannt ist).

    Ich denke die große Portabilität ist der größte Vorteil von good ol' char-Arrays.



  • Der Performanceunterschied ist irrelevant, da marginal.



  • Mis2com schrieb:

    Der Performanceunterschied ist irrelevant, da marginal.

    Interessant. Wie beurteilt man sowas ohne die konkrete Situation sowie die konkrete std::string-Implementation zu kennen? Hast du da eine spezielle Kristallkugel?

    Ich für meinen Teil habe bereits an einem Projekt mitgearbeitet, bei dem die miserable Performance der verwendeten String-Implementation alles andere als irrelevant war. Vielmehr war sie ganz entscheidend. Natürlich haben wir auch da erstmal mit std::string begonnen und dann die Performance des funktionierenden Programms analysiert. Mit dem Ergebnis, dass die String-Implementation ausgetauscht werden musste.

    Der Performance-Unterschied ist nun mal nicht konstant sondern abhängig von der Implementation und dem Einsatzgebiet (dabei kann std::string sogar besser abschneiden als char*), du kannst also nicht einfach sagen irrelevant und die Akte schließen. Hier gilt wie immer: Im Zweifelsfall messen, nicht raten.



  • Ich finde beides schlecht. 😉
    Ich würde lieber ne eigene String-Klasse schreiben. Falls nicht, dann würde ich aber auch zu std::string raten. 😃



  • Optimizer schrieb:

    Ich würde lieber ne eigene String-Klasse schreiben.

    Generell betrachtet ist das natürlich die denkbar schlechteste Lösung.



  • Optimizer schrieb:

    Ich finde beides schlecht. 😉
    Ich würde lieber ne eigene String-Klasse schreiben.

    Wieso das?



  • Ja, jeder sollte seine eigene string-Klasse bauen, mit möglichst verschiedenen Methodennamen, damit auch keiner den Code vom anderen verstehen kann. Am besten wir verschlüsseln die Methodennamen mit MD5. Dann kann man wirklich nur noch selbst die Klasse benutzen. Programmieren muß wieder schwerer werden!
    😃



  • Ich finds schon schwer genug, der Code meines Vorgesetzten ist selbstverschlüsselnd.... ;o)

    Beispiel:

    SpeziellesFlagNichtVerwendenAn=false; // Alles klar :clown:
    
    // irgendwo global:
    bFlag = true;
    
    // Bei der Abfrage:
    // Wenn bFlag = 1 dann fn1;
    // Wenn bFlag = 2 dann fn1;
    // Wenn bFlag = 3 dann fn1;
    // Wenn bFlag = 4 dann fn1;
    
    if(bFlag == 1)
      fn1();
    else if(bFlag == 2)
      fn2();
    else if(bFlag == 3);
      fn3();
    else if(bFlag == 4);
      fn4();
    

    Ein Kunde hat ein Fehler in fn4, aber nirgends wird bFlag auf 4 gesetzt.
    Mir reichen solche rätsel schon 🤡



  • Wieso? Weil std::string gerade noch besser als char* ist. Amsonsten ist es wirklich ... und kann nichts.
    Meine Meinung.
    Ihr könnt da anderer Meinung sein, ihr seid vielleicht nicht so verwöhnt wie ich, aber die std::string-Klasse ist in meinen Augen ein Witz.



  • Also ich finde konkatenieren mit + und Vergleich mit == schonmal sehr sehr praktisch.
    Dann sag doch mal was eine ordenliche string-Klasse können müßte?
    Was fehlt std::string denn?

    MfG Jester



  • Jester schrieb:

    Was fehlt std::string denn?

    ca. -70 Memberfunktionen. 😉



  • for (int a = 0; a < 10; ++a)
        for (int b = 0; b < 10; ++b)
        {
            String path = String("/Grafik/Bild") + a + b + ".bmp";
            ladeBild(path.pointer());   // <- Pseudocode, Funktion übernimmt char*
        }
    


  • @Bashar:
    Ja, da muß ich Dir recht geben.

    @Optimizer:
    Ich verstehe nicht was Du mir mit diesem Code sagen willst.

    MfG Jester



  • Dass das mit std::string nicht geht?
    Dass auch <String> = <String> + <int> nicht geht?
    Dass auch <String> += <int> nicht zum gewünschten Ergebnis führt?

    geschweige denn von verknüpfungen mit double oder float. Offenbar brauchst du nicht viel, wenn std::string alles bietet, was du brauchst.
    Ich muss halt doch öfter mal Bilder in einer Schleife laden.
    Oder mal ne Meldung ausgeben:

    String bla = String("Sie haben noch ") + lives + " Leben übrig.";
    

    Es gibt unzählige Situationen, wo man mit std::string nicht weiter kommt. DAS ist die denkbar schlechteste Lösung, nicht ne eigene Klasse zu schreiben. 🙄



  • 2 Möglichkeiten:

    a) operator+ für string, int überladen
    b) stringstreams benutzen

    MfG Jester


Anmelden zum Antworten