Am 28.02.2012 09:41, schrieb Mattias Gaertner:
On Tue, 28 Feb 2012 09:23:34 +0100
Sven Barth<[email protected]>  wrote:

Am 28.02.2012 05:04, schrieb Martin Schreiber:
Hi,
I read that we should use TBytes instead of AnsiString in order to
implement combined binary/character buffers with automatic memory
management. With AnsiString we used setlength() in order to allocate not
initialized memory.
TBytes is defined as
"
TBytes = array of Byte;
"
where setlength() fills the buffer with zeros. What should we use instead?

For strings SetLength also fills the string with zeros as the following
example shows:

=== example begin ===

program setlengthtest;

var
    barr: array of Byte;
    b: Byte;
    s: AnsiString;
    c: Char;
begin
    SetLength(barr, 20);
    for b in barr do
      Write(b, ' ');
    Writeln;
    SetLength(s, 20);
    for c in s do
      Write(Ord(c), ' ');
    Writeln;
end.

=== example end ===

=== output begin ===

PS P:\tests\oneshots>  .\setlengthtest.exe
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

That's because the OS gives you on first time a lot of zeroed mem.
SetLength does not zero memory. Try this:

var
   i: Integer;
   s: string;
begin
   for i:=1 to 100000 do begin
     SetLength(s,1000000); // size does not matter for speed
     SetLength(s,1);
   end;
end.

In the end I preferred looking at the source of SetLength as written to Martin already ;)

Regards,
Sven

_______________________________________________
fpc-devel maillist  -  [email protected]
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to