Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.166 Beiträge
 
Delphi 12 Athens
 

Stringbehandlung in D2010?

  Alt 1. Sep 2009, 11:26
Wurde die Stringbehandlung eigentlich in D2010 verbessert
oder ist da immernoch so ein Kaos?

Gegeben sei diese Funktion:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var S: String;
begin
  {$STRINGCHECKS ON}
  S := S + 'abc';
  if Length(S) = 123 then
    if S[1] = 'Xthen ;
end;
früher sah es ja in etwa mal so aus (nur halt mit Ansi-Funktionen)
Delphi-Quellcode:
{$STRINGCHECKS OFF}  // StringChecks gab's damal noch nicht, also auch OFF

Unit1.pas.29: S := S + 'abc';
00461B03 8D45FC lea eax,[ebp-$04]
00461B06 BA541B4600 mov edx,$00461b54
00461B0B E8FC3BFAFF call @UStrCat

Unit1.pas.30: if Length(S) = 123 then
00461B10 8B45FC mov eax,[ebp-$04]
00461B13 85C0 test eax,eax
00461B15 7405 jz $00461b1c
00461B17 83E804 sub eax,$04
00461B1A 8B00 mov eax,[eax]
00461B1C 83F87B cmp eax,$7b
00461B1F 7507 jnz $00461b28

Unit1.pas.31: if S[1] = 'Xthen ;
00461B21 8B45FC mov eax,[ebp-$04]
00461B24 66833858 cmp word ptr [eax],$58
aber inzwischen sieht es ja standardmäßig so aus
Delphi-Quellcode:
{$STRINGCHECKS ON}  // standardmäßig steht dieser Sch*** ja auf ON

Unit1.pas.29: S := S + 'abc';
00461B03 8D45FC lea eax,[ebp-$04]
00461B06 BA881B4600 mov edx,$00461b88
00461B0B E8FC3BFAFF call @UStrCat

Unit1.pas.30: if Length(S) = 123 then
00461B10 8B45FC mov eax,[ebp-$04]
00461B13 85C0 test eax,eax
00461B15 7416 jz $00461b2d
00461B17 8BD0 mov edx,eax
00461B19 83EA0A sub edx,$0a
00461B1C 66833A02 cmp word ptr [edx],$02
00461B20 740B jz $00461b2d
00461B22 8D45FC lea eax,[ebp-$04]
00461B25 8B55FC mov edx,[ebp-$04]
00461B28 E8D732FAFF call @InternalUStrFromLStr
00461B2D 85C0 test eax,eax
00461B2F 7405 jz $00461b36
00461B31 83E804 sub eax,$04
00461B34 8B00 mov eax,[eax]
00461B36 83F87B cmp eax,$7b
00461B39 7521 jnz $00461b5c

Unit1.pas.31: if S[1] = 'Xthen ;
00461B3B 8B45FC mov eax,[ebp-$04]
00461B3E 85C0 test eax,eax
00461B40 7416 jz $00461b58
00461B42 8BD0 mov edx,eax
00461B44 83EA0A sub edx,$0a
00461B47 66833A02 cmp word ptr [edx],$02
00461B4B 740B jz $00461b58
00461B4D 8D45FC lea eax,[ebp-$04]
00461B50 8B55FC mov edx,[ebp-$04]
00461B53 E8AC32FAFF call @InternalUStrFromLStr
00461B58 66833858 cmp word ptr [eax],$58
Wie sieht es denn nun unter Delphi 2010 aus (dauert noch etwas mit meiner Trial )

Wenn ich bedenke, daß ich Anfangs mir selber Funktionen geschrieben hab, um dieses Verhalten via Pointer-Casting, PWideChar-Zugriffen und direktem Auslesen der Stringstrukturen in meinem himXML zu umgehn
(immerhin bremst das bei vielen Zugriffen schon etwas extrem aus)

Nun denke ich grad drüber nach, diese eigenen Funktionen wieder der Übersichtlichkeit halber zu entfernen,
seit ich hier in der DP netter Weise auf diesen Kompilerschalter gestoßen bin.
(in der OH steht ja rein garnichts dazu)

Allerdings wäre es ja schlecht, wenn sich dieses in D2010 noch verschlechtert hat.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat