Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Array zuweisungen (https://www.delphipraxis.net/199299-array-zuweisungen.html)

TurboMagic 13. Jan 2019 13:47

Array zuweisungen
 
Hallo,

mal eine "blöde" Frage. Was ist der Unterschied zwischen diesen beiden Code Fragmenten:

Delphi-Quellcode:
function TMyClass.DecodeBytes(const Source: TBytes): TBytes;
begin
  Result := Source;
  if Length(Result) > 0 then
    Decode(Source[0], Result[0], Length(Source));
und

Delphi-Quellcode:
function TMyClass.DecodeBytes(const Source: TBytes): TBytes;
begin
  SetLength(Result, Length(Source));
  if Length(Result) > 0 then
    Decode(Source[0], Result[0], Length(Source));
Vor allem in Bezug auf Speicherallokation und den Fall, wo jemand
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)

Redeemer 13. Jan 2019 15:48

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:
procedure TMyClass.DecodeBytes(var Source: TBytes);
begin
  if Length(Source) > 0 then
    Decode(Source[0], Source[0], Length(Source));
In der Regel wird man Delphi-Referenz durchsuchenSystem.Copy verwenden wollen, wenn man Arrayvariablen etwas zuweist.

peterbelow 14. Jan 2019 11:46

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.

TurboMagic 15. Jan 2019 18:49

AW: Array zuweisungen
 
Vielen Dank an euch beide für die Erklärungen!


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz