[fpc-pascal] Best integer type to be used for string indexes
Mattias Gaertner
nc-gaertnma at netcologne.de
Sun Jun 19 23:47:08 CEST 2011
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.
> > Thus, the question basically is: what integer type
> > is recommended to be used as index/length
> > for future-proof string processing functions?
>
> SizeInt should do just fine.
Yes, because SizeInt is int64 under 64bit.
Mattias
More information about the fpc-pascal
mailing list