![]() |
Array zuweisungen
Hallo,
mal eine "blöde" Frage. Was ist der Unterschied zwischen diesen beiden Code Fragmenten:
Delphi-Quellcode:
und
function TMyClass.DecodeBytes(const Source: TBytes): TBytes;
begin Result := Source; if Length(Result) > 0 then Decode(Source[0], Result[0], Length(Source));
Delphi-Quellcode:
Vor allem in Bezug auf Speicherallokation und den Fall, wo jemand
function TMyClass.DecodeBytes(const Source: TBytes): TBytes;
begin SetLength(Result, Length(Source)); if Length(Result) > 0 then Decode(Source[0], Result[0], Length(Source)); das Funtionsergebnis weiterhin benutzt, obwohl der Aufrufer den Parameter Source schon wieder freigegeben/anderweitig benutzt hat. Kopiert die Wertzuweisung des ersten Falls die Daten um, so wie es Move auch täte nur dass bei der Zuweisung Result vorher noch sauber dimentioniert wird oder wird da Result nur auf die Adresse von Source gesetzt? (eher unwahrscheinlich für mich, aber ich will das verstehen) |
AW: Array zuweisungen
Source und Result sind beides Zeiger. Die Zuweisung im ersten Ausschnitt setzt den Zeiger also so, dass Source und Result auf dasselbe Array zeigen. Man könnte auch das hier schreiben:
Delphi-Quellcode:
In der Regel wird man
procedure TMyClass.DecodeBytes(var Source: TBytes);
begin if Length(Source) > 0 then Decode(Source[0], Source[0], Length(Source)); ![]() |
AW: Array zuweisungen
TBytes ist ein reference type (d. h. eine Variable dieses Typs enthält einen Pointer auf den Speicher, der die eigentlichen Daten enthält). Das erste Konstrukt verändert direkt den Inhalt des übergebenen TBytes arrays, ohne irgendwelchen neuen Speicher zu allokieren. Das sieht auf den ersten Blick seltsam aus, da der Parameter ja als Const deklariert ist. Wieso kann man ihn also modifizieren? Das geht aber bei allen reference types, da der Compiler nur den übergebenen Pointer als Const behandelt und nicht den Speicher, auf den der Pointer verweist. Trotzdem ist das Konstrukt etwas "anrüchig", weil die Deklaration ja auf den ersten Blick so aussieht, als wenn die Methode den übergebenen Parameter nicht ändern wird. Sollte man vermeiden, die Methode hat so einen nicht direkt ersichtlichen side effect.
Das zweite Konstrukt macht es richtig, es allokiert einen neuen, separaten array und liest nur aus dem übergebenen array; Decode speichert das Resultat seiner Arbeit in diesem neuen Array. Das Verhalten der Methode stimmt also mit den Erwartungen des Programmieres überein, der nur die Deklaration der Methode kennt und sich nicht deren Implementierung angesehen hat. Dafür zahlt man einen geringen Aufpreis in erhöhtem Aufwand für die Speicherverwaltung, aber das ist gut angelegtes Kapital. |
AW: Array zuweisungen
Vielen Dank an euch beide für die Erklärungen!
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz