Eigene schnelle strlen/_mbslen/wcslen Funktion



  • Hallo!

    Ich schreibe mir gerade eine eigene String Template Klasse.
    Nun brauche ich natürlich auch eine Funktion die die Länge des Strings ermittelt.
    Zum einen habe an Funktionsüberladung(en) gedacht in etwa so
    Code 1

    inline size_t __fastcall length(const char *pstr)          { return strlen(pstr); }
    inline size_t __fastcall length(const unsigned char *pstr) { return _mbslen(pstr); }
    inline size_t __fastcall length(const wchar_t *pstr)       { return wcslen(pstr); }
    

    Oder eine eigene Template Funktion.
    Code 2

    template<class T>
    inline size_t __fastcall getlen(T *pstr)
    {
        T *pstart = pstr;
    
        while(*pstr != static_cast<T>(0))
            pstr++;
        return static_cast<size_t>(pstr - pstart);
    }
    

    Welcher Code wäre zu bevorzugen (unter der Vorraussetzung das Code 2 100% "richtig" ist) bzw. ist wohl schneller? Die strlen Funktion kann man zum Beispiel bei VC++ inline einbinden.



  • Schneller wird Code 1 sein, da solche Routinen meistens sehr optimiert bereits in Maschinencode vorliegen.

    Trotzdem würde ich zu einer ganz anderen Methode raten:

    class mystring
    {
        size_t len; // oh man beachte ich hab size_t benützt
    
        public:
        inline size_t length () const { return len; }
    };
    

    Natürlich muss man hier beachten auf was man die Klasse optimiert. Meine ist performant wenn die 4 Byte für die Länge kein Problem sind und der String sehr selten angepasst wird (zB einmalige Eingabe durch den Benutzer in einen Name-String).

    Wenn der String sehr oft angepasst wird ist es wohl besser, wenn du ihn in length() berechnest -> dann aber bitte mit strlen() oder was auch immer.

    MfG SideWinder



  • SideWinder schrieb:

    Schneller wird Code 1 sein, da solche Routinen meistens sehr optimiert bereits in Maschinencode vorliegen.

    Ähnliches habe ich mir auch gedacht. -> #pragma intrinsic(strlen)

    SideWinder schrieb:

    Trotzdem würde ich zu einer ganz anderen Methode raten:

    class mystring
    {
        size_t len; // oh man beachte ich hab size_t benützt
    
        public:
        inline size_t length () const { return len; }
    };
    

    Eine Membervariable die die Länge hält habe ich natürlich.
    "lenght" wäre eher eine private Methode. Siehe unten.
    "// oh man beachte ich hab size_t benützt" Das heißt?

    SideWinder schrieb:

    Natürlich muss man hier beachten auf was man die Klasse optimiert. Meine ist performant wenn die 4 Byte für die Länge kein Problem sind und der String sehr selten angepasst wird (zB einmalige Eingabe durch den Benutzer in einen Name-String).
    Wenn der String sehr oft angepasst wird ist es wohl besser, wenn du ihn in length() berechnest -> dann aber bitte mit strlen() oder was auch immer.

    Ich brauche die Funktionen unter anderem für die Überladung des Operators +=. Wenn nur ein String irgendeinen Typs übergeben wird, muss ich doch irgendwie die Länge ermitteln.



  • "lenght" wäre eher eine private Methode.

    Dann nimm doch gleich intern strlen() und bau nicht noch eine eigene Methode drumrum. Aber okay, ein inline-Einzeiler sollte nicht auffallen - dann aber schauen, dass das wirklich inline wird!

    "// oh man beachte ich hab size_t benützt" Das heißt?

    Bin kein großer Fan von diesen STL-Typen und benütze sie daher eher selten. Aber was man nicht alles für das Beispiel tut *g*

    MfG Sidewinder



  • SideWinder schrieb:

    Dann nimm doch gleich intern strlen() und bau nicht noch eine eigene Methode drumrum. Aber okay, ein inline-Einzeiler sollte nicht auffallen - dann aber schauen, dass das wirklich inline wird!

    Aber es ist doch ein eine String-Template Klasse. Deshalb ist die length-Methode auch 3-fach überladen.
    Also wenn ich z.B. wchar_t als Templateparameter nutze, werde ich mit strlen nicht weit kommen. 😉

    SideWinder schrieb:

    Bin kein großer Fan von diesen STL-Typen und benütze sie daher eher selten. Aber was man nicht alles für das Beispiel tut *g*
    MfG Sidewinder

    🙂


Anmelden zum Antworten