Suche nach einer AnsiString-Implementation



  • Moin,

    Ich habe bisher den C++Builder 1 verwendet, möchte jetzt aber zu Code::Blocks+GCC wechseln. Leider habe ich in fast allen bisherigen Projekten AnsiStrings verwendet. Diese scheinen wohl C++Builder-spezifisch zu sein, oder kennt GCC außer std::string auch AnsiString? Wenn nicht, ist der Quelltext einer AnsiString-Implementation irgendwo verfügbar? Sonst müsste ich sie selbst schreiben, was ich mir natürlich ersparen möchte. Und mit einem einfachen typedef ist es auch nicht getan, da sich die beiden Typen ja doch etwas voneinander unterscheiden.
    Und gibt es zwischen std::string und AnsiString eigentlich nennenswerte Performanceunterschiede?

    Danke im voraus,
    Nanyuki



  • Hallo,

    Wechsle lieber komplett zu std::string. Der bietet eigentlich alles was du brauchst. AnsiString ist außerhalb der Borland-Welt nicht bekannt.



  • Hallo

    Performance dürfte sehr ähnlich sein.

    Der wichtigste Unterschied den du beim Umstieg zu beachten hast ist das AnsiString die Indizierung der Zeichen mit 1 beginnt, aber std::string mit 0 (wie es ja auch üblich und korrekt ist)

    bis bald
    akari



  • akari schrieb:

    Der wichtigste Unterschied den du beim Umstieg zu beachten hast ist das AnsiString die Indizierung der Zeichen mit 1 beginnt, aber std::string mit 0 (wie es ja auch üblich und korrekt ist)

    Ja, das ist eines der Probleme bei der Umstellung; da müsste ich überall die Indexierung anpassen, denn

    Braunstein schrieb:

    Wechsle lieber komplett zu std::string.

    ich habe zwar vor, in meinen zukünftigen Projekten ausschließlich std::string zu benutzen, jedoch möchte ich eines meiner aktuellen Projekte zu GCC mitnehmen (u.a. um es nach Linux zu portieren). Problem ist, dass es großzügigen Gebrauch von (Ansi)Strings macht und annähernd 100.000 Zeilen umfasst. Ich denke, da ist es schneller, eine AnsiString-Implementierung zu schreiben, als alles anzupassen (und sich dann mit Fehlern herumzuärgern, weil man irgendwo vergessen hat, eins vom Index abzuziehen) 😉



  • Mit der Original-AnsiString-Implementierung von Borland fängst du unter Linux nichts an (ich habe die Sourcen, da sie beim BCB5 Professional dabei sind), da diese auf Delphi-Routinen, welche von Inline-Assembler-Code aufgerufen werden, basiert.

    Am besten, du schreibst dir gerade einen kleinen Wrapper mit den von dir verwendeten Methoden auf Basis von std::string, z.B.

    namespace System
    {
    
    class AnsiString
    {
    private:
      std::string str;
    
    public:
      AnsiString() {};
      ~AnsiString() {};
    
      ...
    
      int Length() const
      {
        return static_cast<int>(str.length());
      }
    
      char operator [](const int idx) const
      {
        // evtl. noch Index-Check und Exception werfen
        return str[idx-1];
      }
    };
    
    } // namespace System
    

    Die Deklarationen der Methoden kannst du dir in der Header-Datei "VCL/dstring.hpp" anschauen.



  • akari schrieb:

    Performance dürfte sehr ähnlich sein.

    Leider nicht; AnsiString ist deutlich performanter als die meisten std::string-Implementationen. Das hängt teils mit den bereits erwähnten größtenteils in Assembler implementierten Routinen, teils mit der Referenzzählung zusammen, die in std::string der Einfachheit halber und zwecks Vermeidung von Umständen mit Speicherverwaltungskonflikten verschiedener Module nicht verwendet wird (jedenfalls ist mir noch keine referenzzählende Implementation begegnet).

    Ansonsten ist aber der Umstieg auf std::string, bei dringendem Bedarf mithilfe eines Wrappers, sinnvoll. Was die Indizierung angeht, so sei dir angeraten, weniger mit Indizes und eher mit Zeigern auf den String selbst zu arbeiten, da du so die Zugriffe auf die Schnittstelle der Klasse verringerst und Zeiger auch effizienter sein sollten als die Indizierung des Strings. (Daß du einen guten Grund hast, selbst mit den Strings derart umgehen zu müssen, nehme ich an, sonst könntest du ja einfach auf die C-Library zurückgreifen, die die meisten alltäglichen Aufgaben mit in den gebräuchlichen Implementationen nahezu optimaler Effizienz abdeckt.)


Anmelden zum Antworten