Wie groß kann eine CString Variable max. werden!



  • Hi Leute,

    hab nem Ausgabefenster ne CString Variable zugewiesen und möchte ziemlich lange Ausgaben machen. Dazu weise ich der Variable jede neu Zeile wie folgt zu:

    m_Ausgabe += char_buffer;
    UpdateData(FALSE);

    Wie groß kann die Variable m_Ausgabe max. werden, bzw. ist die Art, wie ich die Ausgabe gestalte, schlecht. Gibts da was besseres.

    Danke für alle Antworten.

    Chiao



  • Ich glaube, die maximale Grösse von CString lag bei etwas über 2 GB.
    Ich habe es aber schon mal gehat, das += ziemlich schnell nicht mehr funktioniert hat, schon bei ein paar 100 Zeichen. Mit strcpy und strcat hat es dann aber funktioniert.



  • Das mit 2 Komma nochwas hatte ich ja noch im Kopf:
    http://www.google.de/search?q=cache:qOiGjgU30Y4J:www.cs.uchicago.edu/~frankel/cs116/MS-Coding-Guidlines.doc+CString+2,145,483,647&hl=de
    ...etwa bei 2/3, runterscrollen, bis zu den vielen bunten Markierungen.



  • CString ist von verfügbaren Adreßraum (bzw. Speicher) limitiert.
    Das sind in einer normalen Anwendung *höchstens* 2GB, meist darunter, weiß Adreßraum für Anwendung, DLL's, Heap und Stack abgeht.

    Unter NT kann man den für eine Anwendung insgesamt verfügbaren Adreßßraum auf 3GB aufstocken (bootoption).

    Strings zusammenbauen:

    CString::operator += funktioniert wunderbar solange Speicher da ist (dann wird eine CMemoryException geworfen). Das kann allerdings lange dauern wenn man den String aus kleinen Schnipseln zusammenbaut, weil ständig neu alloziert und umkopiert werden muß.

    CString hat unter VC7 eine Reserve-Funktion mit der man sagen kann wieviel Speicher man denn denkt zu benötigen (ruhig reichlich 🙂 ). Unter VC6 kann man sich wie folgt behelfen:

    void StringReserve(CString & str, DWORD capacity)
    {
      str.GetBuffer(capacity);
      str.ReleaseBuffer();
    }
    

    Damit macht der String intern "schon mal platz" für alles was da kommen mag, und muß nicht bei jedem piepsligen Anhängen neu allozieren.


Anmelden zum Antworten