AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Keine Kopie?

Ein Thema von freimatz · begonnen am 4. Mai 2022 · letzter Beitrag vom 5. Mai 2022
Antwort Antwort
freimatz

Registriert seit: 20. Mai 2010
1.443 Beiträge
 
Delphi 11 Alexandria
 
#1

Keine Kopie?

  Alt 4. Mai 2022, 08:31
Bislang dachte ich, dass dynamisches Arrays wie String behandelt werden. Also wenn diese irgendwohin übergeben werden, dass dann eine Kopie erstellt wird (sofern nötig). Nach Analysen in unsrem Code habe ich einen möglichst einfachen Test erstellt. Folgender Test macht mich ratlos:
Delphi-Quellcode:
unit TestArray;

interface

uses
  System.Classes,
  System.Generics.Collections;

implementation

procedure Test_Array1();
type
  TValueArray = array of Char;
var
  item: TValueArray;
  list: TList<TValueArray>;
begin
  list := TList<TValueArray>.Create();
  SetLength(item, 2);

  item[0] := '1';
  item[1] := '2';
  list.Add(item);
//Watch Name   Value
//list[0]   ('1', '2')

  item[0] := '5';
  item[1] := '4';
  list.Add(item);
//Watch Name   Value
//list[0]   ('5', '4')
end;

initialization

Test_Array1();
halt;

end.
Wir gingen bislang davon aus, dass bei der Übergabe bei "list.Add(item);" eine Kopie übergeben wird. Dem ist scheinbar nicht so.
Wo ist der Denkfehler? (D11)

Nachtrag:
Ich glaub ich habs: https://docwiki.embarcadero.com/RADS...amische_Arrays
Im Gegensatz zu Strings und statischen Arrays wird copy-on-write nicht für dynamische Arrays verwendet.

Geändert von freimatz ( 4. Mai 2022 um 09:23 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Keine Kopie?

  Alt 4. Mai 2022, 09:26
Das klappt nur für statische Arrays (array[0..1] of Char), aber nicht für dynamische Arrays. Dynamische Arrays sind nur Pointer und werden auch nicht anders behandelt.

// EDIT:
Ja, dein Nachtrag stimmt.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.158 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Keine Kopie?

  Alt 4. Mai 2022, 09:53
Dynamische Arrays sind Referenztypen wie z.B. Interfaces oder Objekte.
Statische Arrays sind Wertetypen wie z.B. Records oder Zahlen.

Bei ersteren kopierst du den Zeiger, bei letzteren immer den kompletten Wert.

Das ist auch der Grund weshalb du z.B. bei einer TList<T>.ToArray() eine neues Array bekommst, sonst hättest du ja Zugriff auf den internen Speicher und könntest den beliebig verändern.
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
557 Beiträge
 
Delphi 12 Athens
 
#4

AW: Keine Kopie?

  Alt 4. Mai 2022, 12:33
Im Gegensatz zu Strings und statischen Arrays wird copy-on-write nicht für dynamische Arrays verwendet.
Wie ist dann der darauf folgende Satz zu verstehen: Deshalb werden diese nicht automatisch kopiert, bevor einem ihrer Elemente ein Wert zugewiesen wird.? Das klingt doch so, als würde nach Wertzuweisung doch kopiert, was dem nachfolgenden Beispiel widerspricht. Ist dieser Satz einfach falsch, oder worauf bezieht er sich?
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.443 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Keine Kopie?

  Alt 4. Mai 2022, 13:26
// EDIT:
Ja, dein Nachtrag stimmt.
Danke

Dynamische Arrays sind Referenztypen wie z.B. Interfaces oder Objekte.
Und was sind dann Strings?
Das sind doch auch Referenztypen.

Und Dynamische Arrays sind nicht "wie z.B. Interfaces oder Objekte". Bei denen musst Du dich um die Erzeugung selber kümmern und teilweise auch um die Freigabe. Bei dynamischen Arrays musst Du das nicht (wie auch bei Strings). Wir finden das verwirrend. (https://en.wikipedia.org/wiki/Princi...t_astonishment)
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
647 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Keine Kopie?

  Alt 4. Mai 2022, 13:28
Ja meiner Meinung nach ist der Satz falsch oder halt unverständlich. Ein Dynamsicher Array ist wie eine String und verhält sich auch so. Wenn du den Array an eine Funktion mit einem var oder const Parameter übergibst, wird nur der Pointer darauf übergeben und nichts kopiert. Das ist gleich wie bei einem String. Der String /Array wird nur kopiert, wenn der Parameter kein const/var ist, z.B. hier: MyProc(myStr: String) / MyProc(myArray: TValueArray).

In deinem Fall von TList.Add ist der Parameter ein Pointer und daher wird da auch nichts kopiert, sondern einfach nur der Pointer auf den Array übegeben. Das Problem ist also nicht wirklich das Array, sondern die Funktion von TList, die du falsch verstanden hast.

Geändert von Rolf Frei ( 4. Mai 2022 um 13:41 Uhr)
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.443 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Keine Kopie?

  Alt 4. Mai 2022, 17:50
Rolf, ich weiss jetzt nicht ob ich Dich verstanden habe. Für mich hört das was Du schreibst so an, als ob Du meinst, dass dynamische array und String gleich behandelt wird. Das stimmt nicht.
Es gilt für die Speicherverwaltung, man muss beide nicht erzeugen und freigeben. Für das automatische Kopieren gilt das nicht. Nochmals "Im Gegensatz zu Strings und statischen Arrays wird copy-on-write nicht für dynamische Arrays verwendet."
Wenn man bei dem obigen Testprogramm statt "array of Char" dann String verwendet, dann kommen andere Werte raus.
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
647 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Keine Kopie?

  Alt 5. Mai 2022, 13:47
Ja wir haben glaube ich etwas aneinander vorbeigeredet oder mein Verständnis von dynamischen Arrays war nicht ganz richtig. Deine Erkenntnis ist so richtig.
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.443 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Keine Kopie?

  Alt 5. Mai 2022, 15:50
Mein Verständnis hat sich auch deutlich geändert diese Tage
Zum Glück haben wir das in einem unit test bemerkt.
Und anderen Programmiersprachen ist das Verhalten von Typen meistens viel einheitlicher.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:31 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