struct automatisch verwalten
-
Hallo,
ich bin gerade dabei Code zu schreiben, der sehr oft einzelnen Zeichen zu Strings zusammenfügt, deren Anzahl vorher nicht bekannt ist. Ich müsste also bei jedem neuen Zeichen realloc() verweden, was ich aus Performancegründen vermeiden wollte. Also halt jedes Mal mehrere Zeichen reservieren.
Dazu bräuchte ich einen Pointer, der mir sagt wie viel Platz noch frei istDas ist auch nicht weiter schwer: struct erstellen, bei zu wenig Speicher neuen Speicher reservieren und fertig.
Was mich dabei aber stört, ist, dass ich nun bei jedem String-Zugriff zuerst auf die struct zugreifen muss. Also hab ich mir gedacht, dass ich ja eigentlich ja gar nicht auf die struct zugreifen muss, wenn ich einen Konstruktor erstelle, der Speicher für einen char-Pointer reserviert und dessen Adresse in einer struct speichert. Mit einem Makro oder einer Funktion könnte ich dann komfortabel neuen Speicher bei einer Größenänderung des Strings reservieren. Müsste dazu nur intern nach der Adresse suchen und der Rest ergibt sich.
Problem dabei: Ich muss eine Liste anlegen, in der die Strnigpointer verwalten werden und das durchsuchen der Liste nach dem richtigen String wäre auch nicht gerade ressourcenschonend.
Ist es also am besten wenn ich in den sauren Apfel beiße und halt jedes Mal zur Stringverarbeitung auf die struct zugreife, oder hättet ihr noch eine andere Lösung wie man die Strings komfortabel und gleichzeitig noch ressourcensochonend verwalten kann?
-
Antoras schrieb:
Ist es also am besten wenn ich in den sauren Apfel beiße und halt jedes Mal zur Stringverarbeitung auf die struct zugreife, oder hättet ihr noch eine andere Lösung wie man die Strings komfortabel und gleichzeitig noch ressourcensochonend verwalten kann?
Ja, schon mal BString angeschaut? Insgesamt performanter, ob es wirklich beim zeichenweisen Anhängen schneller ist, weiß ich mangels praktischen Einsatzes allerdings nicht.
-
Dazu bräuchte ich einen Pointer, der mir sagt wie viel Platz noch frei ist
Hmm, der VMM weiss ja wieviel noch frei ist und hat diese Informationen schon.
Mit der winapi kann man das sogar abfragen: _msize.
Würde mich mal wirklich intressieren ob realloc so langsam ist,
habe es für soetwas noch nie geprüft.Ansonsten hilft vieleich das:
struct SBuf { size_t len; size_t lenMax; }; char* str;
Wobei man struct SBuf komplett 'verstecken' kann.
Man alloziert das Struct und str in einem und gibt selbst nur str raus!also irgendwie soetwas:
SBuf* pBuf = (SBuf*) malloc (sizeof SBuf + len + 1); char* str = char* (pBuf) + sizeof (SBuf);
Wenn du willst dann kannst du vieles davon mit Makros lösen.
---
Stimmt ist ein zielmicher hack, must du ja nicht so machen ...Gruß Frank
-
Also, ich hab jetzt eingesehen, dass das direkte Arbeiten mit einer struct das einfachste ist. BString macht das auch so und genau genommen ist es auch nicht viel komplizierter als ohne struct, hat aber den Vorteil, dass ich durch Makros z.B. Getter und Setter komfortabel realisieren kann.
Hab das jetzt so:
typedef char *string_t; typedef struct _string_s { string_t data; unsigned size; unsigned space; } string_s;
Und ein einfacher Getter:
#define string_get(str) str->data
Das ist super, falls ich später mal noch was ändere. Und bei der Speicherallokierung hab ich es jetzt so gemacht, dass ich immer 10 Zeichen auf einmal reserviere. Ob der Wert was taugt muss dann ein praktischer Einsatz zeigen.
Danke für eure Antworten.
-
Frank Erdorf schrieb:
Würde mich mal wirklich intressieren ob realloc so langsam ist,
habe es für soetwas noch nie geprüft.Dann würdest du dich wohl ganz schön wundern.
:p