[fpc-devel] TBytes

Sven Barth pascaldragon at googlemail.com
Tue Feb 28 09:53:24 CET 2012


Am 28.02.2012 09:41, schrieb Mattias Gaertner:
> On Tue, 28 Feb 2012 09:23:34 +0100
> Sven Barth<pascaldragon at googlemail.com>  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




More information about the fpc-devel mailing list