std::string Speicherdarstellung - mit char* überschreiben?



  • BinaryIStream &operator>>(std::string &s) // operator für alles überladen, hier string
    {
        unsigned len;
        *this>>len;  // Länge (32 Bit) wird immer vor den String geschrieben (ohne Nullterminierung)
        s.resize(len);
        read(&s[0], len);
    
        return *this;
    }
    

    So wärs deutlich schneller.

    Oder nullt der vector alle Elemente? Das waere ja noch lahmer...

    Ja, sie werden default konstruiert.



  • unsigned ist schonmal, was binäres lesen angeht, Gift für Plattformunabhängigkeit. Entweder uint16_t oder uint32_t, wobei ich nicht glaube das jemand mehr als 65535 Zeichen in einen String stecken möchte.



  • Ethon schrieb:

    BinaryIStream &operator>>(std::string &s) // operator für alles überladen, hier string
    {
        unsigned len;
        *this>>len;  // Länge (32 Bit) wird immer vor den String geschrieben (ohne Nullterminierung)
        s.resize(len);
        read(&s[0], len);
    
        return *this;
    }
    

    So wärs deutlich schneller.

    Exakt so mache ich es auch beim std::string derzeit! Zuerst ein full-resize und dann direkt reinkopieren lassen. Die festen 32-Bit geben die Länge zu Beginn an und werden jeweils in little-endian oder big-endian übertragen.

    std::wstring behandle ich anders.



  • 314159265358979 schrieb:

    unsigned ist schonmal, was binäres lesen angeht, Gift für Plattformunabhängigkeit. Entweder uint16_t oder uint32_t, wobei ich nicht glaube das jemand mehr als 65535 Zeichen in einen String stecken möchte.

    Ich nutze nur die Datentypen aus cstdint (uint8_t, uint32_t, etc.) in meiner Serialisierung-Lib.

    Ich finde, das sorgt für mehr Klarheit. 🙂


Anmelden zum Antworten