[fpc-devel] Performance of string handling in trunk
DrDiettrich1 at aol.com
Wed Jun 26 18:02:34 CEST 2013
Sven Barth schrieb:
> Am 26.06.2013 14:02, schrieb Michael Schnell:
>> On 06/26/2013 01:40 PM, Sven Barth wrote:
>>> It's the whole use of RawByteString that the encoding is kept. For
>>> all other string types the content will be converted
>> That is what I did assume, but I understood dodi in a way that he
>> suggested that it (with normal means such as assigning to another
>> String) is not possible to make use of the encoding type of a String
>> information that had been assigned to a RawByteString.
> See here: http://docwiki.embarcadero.com/VCL/XE/de/System.StringCodePage
The documentation is not complete. Empty strings have no associated
string record, thus no encoding; StringCodePage always returns the
CP_ACP for empty strings.
This means that Delphi offers no means to determine the static
(declared) type of an AnsiString variable (except by RTTI?).
This also requires compiler magic on string assignments, so that the
static encoding of the target variable can be determined and used to
force a conversion if required, even if the target is an empty string.
This magic seems to be buggy, or inconsistent at least, as observed in
my test programs. When a RawByteString is assigned to an AnsiString
variable, both variables refer to the same string memory. Afterwards the
AnsiString can show strange behaviour, as long as it retains a "foreign"
The RawByteString type is type AnsiString($FFFF). RawByteString enables
the passing of string data of any code page without doing any code page
conversions. RawByteString should only be used as a const or value type
parameter or a return type from a function. It should never be passed by
reference (passed by var), and should never be instantiated as a variable.
I'd extend this warning, that a RawByteString never should be assigned
to an AnsiString variable, because the behaviour of that variable
becomes almost unpredictable then.
[Unless some newer Delphi version fixes this flaw]
WRT performance, FPC can make use of that undefined behaviour, and
create the most performant code by not checking and handling
beforementioned situations. Or FPC can implement more consistent
behaviour (to be defined).
More information about the fpc-devel