Ganz einfach, 'Hello World' ist ein Konstanter string, der mit in die Anwendung kompiliert wird und bei der ausführung im Konstantenspeicher rumliegt und sich während der Laufzeit nie ändert. Wenn du dann was an dem String ändern willst dann muss eine neue Änderbare Kopie erzeugt werden.
Und das ist auch gut so, stell dir mal vor das wäre nicht der fall:
Wenn der String 'I ist' in diesem Fall nicht Konstant wäre, müsste der in jeder Iteration eine Kopie davon erzeugen, so wird einfach immer wieder der gleiche String benutzt.
Das gilt auch für verschiedene Variablen:
Code: Alles auswählen
s1 := 'Hello World';
s2 := 'Hello World';
WriteLn(IntPtr(s1) = IntPtr(s2)); // True
Hier bekommen s1 und s2 das selbe String Objekt weil es der selbe string ist. Wenn nicht müssten hier 2 Kopien angefertigt werden.
Zusätzlich dazu ist es generell so das Strings so genanntes Lazy Copy verfahren haben. D.h. wenn du einen String änderst aber mehrere Referenzen auf den selben String hast, dann wird eine Kopie erzeugt, um die anderen Strings nicht zu beeinflussen:
Code: Alles auswählen
ReadLn(s1);
s2 := s1;
WriteLn('S1: ', s1);
WriteLn('S2: ', s2); // gleich
s1[1] := 'F';
WriteLn('S1: ', s1); // Geändert
WriteLn('S2: ', s2); // Original
Wenn du aber nur eine Referenz auf den string hast, dann wird einfach in-place geändert ohne eine kopie zu erzeugen (daher lazy copy, da immer nur kopiert wenn notwendig)