Dies ist Delphi 2009, daher gilt Unicode.Warum belegt SetString weniger Speicher in Delphi (mit Unicode)?
Ich hatte einige Code, der Saiten von einem Puffer in einen String geladen wurde, wie folgt:
var Buffer: TBytes; RecStart, RecEnd: PChar; S: string;
FileStream.Read(Buffer[0], Size);
repeat
... find next record RecStart and RecEnd that point into the buffer;
SetString(S, RecStart, RecEnd - RecStart);
MyStringList.Add(S);
until end of buffer
Aber während einigen Modifikationen, ich so meine Logik geändert, dass ich die identischen Aufzeichnungen Zugabe endete, sondern als Strings separat und nicht durch SetString abgeleitet, dh
var SRecord: string;
repeat
SRecord := '';
repeat
SRecord := SRecord + ... processed line from the buffer;
until end of record in the buffer
MyStringList.Add(SRecord);
until end of buffer
Was die Speichernutzung des String mir auffiel, war auf etwa 70 MB von 52 MB stiegen. Das war ein Anstieg von über 30%.
Um zu meinem unteren Speicherverbrauch zurück, fand ich hatte ich SetString zu verwenden, um die String-Variable zu erstellen, um meine String wie folgt hinzuzufügen:
repeat
SRecord := '';
repeat
SRecord := SRecord + ... processed line from the buffer;
until end of record in the buffer
SetString(S, PChar(SRecord), length(SRecord));
MyStringList.Add(S);
until end of buffer
prüfen und zu vergleichen S und SRecord, sie sind in alle Fälle genau gleich. Aber das Hinzufügen von SRecord zu MyStringList verwendet viel mehr Speicher als das Hinzufügen von S.
Weiß jemand, was los ist und warum der SetString Speicher spart?
Follow-up. Ich hätte es nicht gedacht, aber ich habe nachgesehen, um sicherzugehen.
Weder:
SetLength(SRecord, length(SRecord));
noch
Trim(SRecord);
gibt den Überschuss Raum. Der SetString scheint dazu erforderlich zu sein.
Übrigens, das ist meine 100ste Frage bei StackOverflow. Ich möchte der Programmierergemeinschaft hier für die enorme Hilfe danken, die sie mir bei der Lösung meiner Programmierprobleme in den letzten zwei Jahren gegeben haben. – lkessler