
On Sam, 03 Aug 2002 at 10:45 (+0200), Thorsten Haude wrote:
Moin,
* Bernd Brodesser <B.Brodesser@t-online.de> [02-08-03 10:08]:
* Thorsten Haude schrieb am 03.Aug.2002:
* Jan Trippler <Jan.Trippler@t-online.de> [02-08-02 22:04]: Was ist, wenn man z.B eine Zeile einer Datei oder der Standardeingabe einliest? So eine Zeile ist normalerweise max. 80 Zeichen lang, kann aber sehr, sehr viel länger sein. Wenn es eine Datei von 2GB ist und sie kein \n enthält, dann ist diese eine Zeile verdammt lang. Wo willst Du da die Grenze legen?
Sowas habe ich noch nicht gemacht. An der Stelle muß man natürlich besondere Vorsichtsmaßnahmen treffen, wie immer bei fremden Strings.
Ja, z. B. nicht mit fest vordefinierten Längen arbeiten.
Kann man die #definierte Länge wohl auch dazu benutzen, einen String zu allozieren? Wenn nein, warum nicht?
Wenn ich eine feste Länge habe, warum sollte ich dann noch dynamisch allozieren?
Um den Speicherplatz wieder freigeben zu können.
Trotzdem bleibt die Verschwendung von Speicher, weil ein #define ja den größtmöglichen Wert abbilden muss. Siehe meine andere Mail - wenn es z. B. um große Listen geht, kommt da eine Menge Holz zusammen, die auch im Zeitalter der GB-Speicher nicht zu vernachlässigen ist. [...]
Aber was ist das für einen Aufwand?
Kein besonders großer; wenn alle String konstante Längen haben kann das der Compiler erledigen.
Du gehst von einer ziemlich starken Einschränkung aus. Wenn Längen nicht mehr konstant sind (und das dürfte die Mehrheit sein), ist der Compiler draußen.
Im Übrigen ist das Tempo in 99% der Fälle nicht so wichtig (weil eh schnell genug) wie die Sicherheit vor Bufferproblemen.
Wo hast Du _das_ denn her? Nebenbei: Du betreibst Demagogie, Du behauptest nämlich implizit, dass die Verwendung von strcmp() Bufferprobleme verursacht - womit Du immer noch allein bist. Gerade bei Sortier-Algorithmen (DBMS, ...) ist Performance einer der ausschlaggebenden Faktoren - Sicherheit auch, aber das tut der Verwendung von strcmp() ja keinen Abbruch - nur Deiner Meinung nach.
Wenn es nur ein einziger, oder wenige Vergleiche sind, so ist das sicherlich egal. Aber gerade Vergleiche können sehr, sehr häufig vorkommen. Denk mal an Sortierprogramme.
Mache ich nicht, weil man in dem Fall die Strings von Anfang an anders verwalten kann.
Wie?
Das willst du alles hart kodiert in das Programm schreiben? Wie flexibel und gut wartbar ;-)
Dafür gibt's #defines.
Der Wert wird beim Compelieren festgelegt. Was ist, wenn ein und die Gleiche Funktion von verschiedene Programmteile benutzt wird, die ganz unterschiedliche Längen haben?
Dann wird die Länge mit übergeben.
Und wieder ein Parameter mehr, der den Stack belastet und zur potenziellen Fehlerquelle wird (short - int - long - unsigned - 32 Bit - 64 Bit, ...) - und der natürlich in den Funktionen ebenfalls zu größerer Komplexität führt. Jan