if (char == ?



  • Hi!

    Man kann sich das evtl mal kurz anschauen. Aber wirklich brauchen tust du sie nicht. Und in seinem Fall erst recht nicht.

    grüße



  • Kann man eigentlich mit std::string schneller die Länge eines null-terminierten char* rausfinden als mit strlen? Wenn nicht, dann bleibe ich auch bei C++ bei den C-Funktionen 🙂



  • Hi!

    std::string s( "Hallo Welt" );
    std::cout << s.length();
    

    Von Aufwand ist das wohl das selbe. Oder was meist du mit schneller?

    grüße



  • Na wenn ich es über die Stringklasse mache, muss ja erst ein Objekt erzeugt werden (evtl. wird der String dann sogar kopiert, weiß ich nicht genau). Wenn ich strlen benutze wird direkt die Länge zurückgegeben, ohne vorher die geringste Kleinigkeit zu tun.



  • Neku schrieb:

    Na wenn ich es über die Stringklasse mache, muss ja erst ein Objekt erzeugt werden (evtl. wird der String dann sogar kopiert, weiß ich nicht genau). Wenn ich strlen benutze wird direkt die Länge zurückgegeben, ohne vorher die geringste Kleinigkeit zu tun.

    Stimmt nicht :p

    Beim Aufruf von strlen wird der String komplett durchgenudelt. Beim nochmaligen Aufruf nochmal 😉

    s.length() liefert vermutlich solange denselben, konstanten Wert wie sich die String-Daten in s nicht ändern, hat also hier einen Cache-Effekt.



  • Hi!

    Wo ist dein Problem? Wenn du ein C-String verwendest benötigst du auch Speicher, also kannst du genauso gut ein string Objekt erzeugen.
    Und strlen( "Hallo Welt" );[ halt ich nicht für besonders sinnvoll, zumal hier auch eine Temporäre Variable erstellt wird.

    Und warum willst du bitte in C++ alte C Funktionen verwenden, wenn es doch viel bessere Alternativen gibt?
    Wenns dir nur um Geschwindigkeit geht, dann verwende lieber gleich reines C.

    Rest: siehe vorigen Post! 🙂

    grüße



  • LordJaxom schrieb:

    Beim Aufruf von strlen wird der String komplett durchgenudelt. Beim nochmaligen Aufruf nochmal 😉

    s.length() liefert vermutlich solange denselben, konstanten Wert wie sich die String-Daten in s nicht ändern, hat also hier einen Cache-Effekt.

    Ich brauche den Wert aber nur ein einziges Mal, Cachen ist da überflüssiger Overhead.

    David_pb schrieb:

    Wo ist dein Problem? Wenn du ein C-String verwendest benötigst du auch Speicher, also kannst du genauso gut ein string Objekt erzeugen.
    Und strlen( "Hallo Welt" );[ halt ich nicht für besonders sinnvoll, zumal hier auch eine Temporäre Variable erstellt wird.

    Der String ist bereits im Speicher -> es geht also nicht um

    ... strlen ("blubb");
    

    sondern um

    void abc (char* c) {
    ... strlen (c);
    }
    


  • Hi!

    In dem Fall ist es auch egal ob du ein std::string Objekt hast. Das ist zwar ein paar Byte größer sollte aber trotzdem vorgezogen worden.
    Wenn du so übermäßig auf Geschwindigkeit, Overhead, Bytesparenwosnurgeht achtest dann benutz C.

    grüße



  • David_pb schrieb:

    Hi!

    In dem Fall ist es auch egal ob du ein std::string Objekt hast. Das ist zwar ein paar Byte größer sollte aber trotzdem vorgezogen worden.
    Wenn du so übermäßig auf Geschwindigkeit, Overhead, Bytesparenwosnurgeht achtest dann benutz C.

    grüße

    Es geht doch gar nicht darum wie es im Speicher liegen soll. Es liegt als char-Zeichenkette im Speicher und daran kann ich nichts ändern. Es geht darum, weshalb ich ein temporäres std::string-Objekt erzeugen soll, wenn dies gar nicht notwendig ist.

    ... und C hat keine Klassen und Templates, die brauche ich 😛



  • Hi!

    Genau, C hat keine Klassen. Und C ist alt, typenunsicher und was weis denn ich...
    Wenn du die Vorzüge von C++ nutzen willst solltest du vorhandene Alternativlösungen zu C Funktionen bevorzugen.
    Aber seis drum... Mix soviel C++ und C wie nur möglich!

    grüße



  • David_pb schrieb:

    Hi!

    Genau, C hat keine Klassen. Und C ist alt, typenunsicher und was weis denn ich...
    Wenn du die Vorzüge von C++ nutzen willst solltest du vorhandene Alternativlösungen zu C Funktionen bevorzugen.
    Aber seis drum... Mix soviel C++ und C wie nur möglich!

    grüße

    Ich sehe keinen Grund eine C-Funktion nicht zu verwenden, wenn diese schneller und einfacher ist - einen Vorzug bei der C++-Lösung sehe ich hier nicht. Aber strlen muss ich sowieso bald selbst schreiben, weil der Rückgabetyp size_t ist 🙄

    Worum ging es in diesem Thread eigentlich? 😃



  • Neku schrieb:

    Kann man eigentlich mit std::string schneller die Länge eines null-terminierten char* rausfinden als mit strlen?

    Das kommt ganz auf die Situation an. Die Länge eines String Literals ist ziemlich sicher mit strlen schneller zu ermitteln. Das liegt einfach daran, dass Compiler diese Funktion idR intrinsic implementiert haben. Und wenn er optimiert, strlen sozusagen schon zur Compilezeit ausführen kann.

    Für sowas

    std::cout << strlen("Hallo") << std::endl;
    

    erzeugt der Compiler dann praktisch folgenden Code

    std::cout << size_t(5) << std::endl;
    

    Wenn es kein String Literal ist, dann ist strlen trotzdem die bessere Wahl, sofern es dir nur darum geht, die Länge zu ermitteln. strlen iteriert dann einfach über die Zeichenkette bis ein Nullzeichen gefunden wurde. Die Laufzeit hängt dann natürlich von der Länge des Strings ab. std::string::length() hat hingegen zwar eine konstante Laufzeit (idR ein simples return einer Membervariablen), du musst vorher aber halt noch ein solches Objekt erzeugen, also samt Speicherreservierung und Initialisierung. Und das ist aufwändiger und dauert länger als strlen.

    Trotzdem soll dich das nicht davon abhalten, in C++ grundsätzlich std::string zu benutzen.



  • Juhu, endlich einer der es versteht 😃

    std::string verwende ich nicht, da ich an einer eigenen Klasse arbeite (wofür ich u.a. das strlen verwende). Meine Klasse soll (vorerst) Unicode, ISO/IEC 8859 und ASCII unterstützen.

    Weiß zufällig jemand, welches Format wchar_t verwendet? UTF-16?



  • Hi!

    Das kommt ganz auf die Situation an. Die Länge eines String Literals ist ziemlich sicher mit strlen schneller zu ermitteln. Das liegt einfach daran, dass Compiler diese Funktion idR intrinsic implementiert haben. Und wenn er optimiert, strlen sozusagen schon zur Compilezeit ausführen kann.

    Das funktioniert aber auch nur bei statischen Stringwerten. std::string wiederrum cached die Länge des Strings und kann somit u.U. schnellere Ergebnisse bringen.

    grüße



  • Neku schrieb:

    Weiß zufällig jemand, welches Format wchar_t verwendet? UTF-16?

    Das ist vollkommen Plattform-, bzw. Compilerabhängig. Am besten nimmst du einfach einen Integertyp. Was spricht dagegen, deinen neuen String von std::string abzuleiten? Die "Ist-ein" Beziehung ist hier ja wohl mal so gut wie sonst nirgends erfüllt. Ich mache das zumindest so (arbeite gerade an einer ähnlichen Sache).



  • Ich mag std nicht.

    wchar_t muss ich hier und da verwenden, um z.B. Dateiaktionen durchzuführen (Windows unterstützt ja Unicode-Dateinamen, wie das bei Linux ist weiß ich nicht).



  • Neku schrieb:

    Ich mag std nicht.

    Warum programmierst du dann C++?

    Neku schrieb:

    wchar_t muss ich hier und da verwenden, um z.B. Dateiaktionen durchzuführen (Windows unterstützt ja Unicode-Dateinamen, wie das bei Linux ist weiß ich nicht).

    Wie gesagt, was wchar_t genau ist, ist dem Compilerhersteller vorbehalten, hauptsache es passt ein erweiterter Zeichensatz rein. MinGW unterstützt wchar_t nicht, deshalb benutz ich es nie und weiß nicht, wie der Linux-gcc das handhabt.
    Was die Dateinamen angeht musst du unterscheiden. AFAIK benutzt Windows UTF-16 (das veraltete(!) Encoding, dass alle anderen einschränkt) und Linux UTF-8. Beides ist Unicode, aber nicht ohne Umwandlung kompatibel zueinander.



  • .filmor schrieb:

    Neku schrieb:

    Weiß zufällig jemand, welches Format wchar_t verwendet? UTF-16?

    Das ist vollkommen Plattform-, bzw. Compilerabhängig. Am besten nimmst du einfach einen Integertyp. Was spricht dagegen, deinen neuen String von std::string abzuleiten? Die "Ist-ein" Beziehung ist hier ja wohl mal so gut wie sonst nirgends erfüllt. Ich mache das zumindest so (arbeite gerade an einer ähnlichen Sache).

    Auch wenn ich immer dafür bin die STL zu verwenden. Von std::string ableiten ist kein guter Gedanke.

    Neku schrieb:

    Ich mag std nicht.
    wchar_t muss ich hier und da verwenden, um z.B. Dateiaktionen durchzuführen (Windows unterstützt ja Unicode-Dateinamen, wie das bei Linux ist weiß ich nicht).

    Was hast du gegen die STL. Die Klassen sind grandios und sollten, da im C++ Standard enthalten, auch verwendet werden.
    C Funktionen im C++ Code kann zwar mal vorkommen sollte aber vermieden werden und ist, wie ich meine, (meist) kein besonders guter Stil.

    grüße



  • David_pb schrieb:

    Auch wenn ich immer dafür bin die STL zu verwenden. Von std::string ableiten ist kein guter Gedanke.

    Warum? Falls es an daran liegt, dass std::string ein typedef ist, dann sollte er halt von basic_string<char> ableiten. Er kann auch einen string als Member verwenden, nur halt kein komisches Array.



  • .filmor schrieb:

    Neku schrieb:

    Ich mag std nicht.

    Warum programmierst du dann C++?

    Weil es Klassen, Templates u.a. ermöglicht - frag nicht so blöd ... C++ besteht nicht nur aus der STL!

    std::basic_string<uint16>? Würg...

    .filmor schrieb:

    AFAIK benutzt Windows UTF-16 (das veraltete(!) Encoding, dass alle anderen einschränkt) und Linux UTF-8.

    Wieso denn bitte "veraltet"? UTF-32 (welches Linux glaube ich verwendet) verbraucht viel zu viel Speicher.


Anmelden zum Antworten