Ja, in Ihrem spezifischen Beispiel gibt es nur eine Zuweisung. Wenn Sie UniqueString
verwendet hätten, wie mghie sagt, oder wenn Sie den String dynamisch aufgebaut hätten, würden Sie am Ende eine neue String-Zuweisung erhalten, auch wenn der Stringinhalt mit einem anderen String übereinstimmt.
Ein interessanter Fakt über Ihr spezifisches Beispiel: Tatsächlich wird überhaupt kein Speicher für den String '1234567890' allokiert. Die Daten für String-Konstanten werden im ausführbaren Bild auf der Festplatte gespeichert und vom Betriebssystem in den Speicher geladen, wenn der Code darauf zugreift. Es nimmt Speicheradresse ein, als Teil der gesamten in-Memory-Zuordnung des ausführbaren Moduls, aber da es vom ursprünglichen ausführbaren Bild auf der Festplatte unterstützt wird, bildet es keinen Teil des committeten Speichers des Prozesses und benötigt keine Unterstützung in der Auslagerungsdatei.
Zum Beispiel wird dieses Programm bei der Ausführung einen Zugriffsverletzungsfehler melden:
{$apptype console}
uses SysUtils;
const
s = '1234567890';
procedure Change(const r: string);
var
p: PChar;
begin
p := PChar(r);
p^ := 'x';
end;
begin
try
Change(s);
except
on e: Exception do
Writeln(e.Message);
end;
end.