[fpc-pascal] Best integer type to be used for string indexes

Michael Van Canneyt michael at freepascal.org
Sun Jun 19 23:57:04 CEST 2011



On Sun, 19 Jun 2011, Mattias Gaertner wrote:

> On Sun, 19 Jun 2011 11:28:22 +0200 (CEST)
> Michael Van Canneyt <michael at freepascal.org> wrote:
>
>>
>>
>> On Sat, 18 Jun 2011, Vladimir Zhirov wrote:
>>
>>> Hi,
>>>
>>> Reviewing a bunch of my string processing functions
>>> made me wonder what integer type should I use for
>>> position / length parameters.
>>>
>>> I used to plain "Integer" for this task, but looking through
>>> RTL and LCL code I noticed that sometimes SizeInt and
>>> even PtrInt are also used:
>>> - Length, Copy use Integer;
>>> - Pos, Delete, Insert use SizeInt;
>>> - UTF8Length, UTF8Pos, UTF8Copy, etc. use PtrInt.
>>>
>>> PtrInt use seems to be generally discouraged by FPC docs
>>> but does it apply to this particular case?
>>>
>>> The only benefit I see in SizeInt/PtrInt is larger size on 64-bit
>>> targets, that should theoretically make it possible to index
>>> larger strings. But is AnsiString type capable of holding more
>>> than High(Integer) bytes, or will it be so in the future?
>>
>> Ansistring is not capable of keeping more than High(Integer) bytes.
>
> That's not true. At least 3*high(integer) compiles and runs fine here on
> 64bit:
>
> var
>  s: ansistring;
> begin
>  SetLength(s,3*High(integer));
>  s[length(s)]:='A';
>  s[length(s)]:='B';
>  writeln(s[length(s)],' ',length(s));
> end.
>
> I don't know where the real limit is.

Hm. I checked again.

Indeed, the hidden ansistring record contains
   TAnsiRec = Packed Record
     Ref,
     Len   : SizeInt;
     First : Char;
   end;
Which in fact means that the limit is the OS memory limit.

Michael.



More information about the fpc-pascal mailing list