Esto es Delphi 2009, por lo que se aplica Unicode.¿Por qué SetString toma menos memoria en Delphi (con Unicode)?
que tenían un código que estaba cargando cadenas de un búfer en un StringList de la siguiente manera:
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
embargo, durante algunas modificaciones, he cambiado la lógica de modo que acabé añadiendo los registros idénticos, sino como una cuerdas derivados por separado y no a través de SetString, es decir
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
lo que llamó la atención fue el uso de memoria de la StringList subió de 52 MB a unos 70 MB. Eso fue un aumento de más del 30%.
Para volver a mi menor uso de memoria, me encontré con que tenía que usar SetString para crear la variable de cadena para añadir a mi StringList de la siguiente manera:
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
Inspección y comparando S y srecord, están en todos los casos son exactamente iguales. Pero agregar SRecord a MyStringList usa mucha más memoria que agregar S.
¿Alguien sabe qué está pasando y por qué SetString guarda la memoria?
Seguimiento. No pensé que lo haría, pero lo revisé solo para asegurarme.
Ni:
SetLength(SRecord, length(SRecord));
ni
Trim(SRecord);
libera el exceso de espacio. SetString parece ser necesario para hacerlo.
Por cierto, esta es mi pregunta número 100 en StackOverflow. Me gustaría agradecer a la comunidad de programación por la tremenda ayuda que me han brindado para resolver mis problemas de programación en los últimos 2 años. – lkessler