Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Frage zu den "neuen" Records in 10.4 (https://www.delphipraxis.net/204628-frage-zu-den-neuen-records-10-4-a.html)

jaenicke 14. Jun 2020 20:22

AW: Frage zu den "neuen" Records in 10.4
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1467247)
Zitat:

Zitat von jaenicke (Beitrag 1467233)
Wenn sie in irgendeiner Version einmal nicht mit kopiert wurden, war das ein Bug.

Tatsächlich? Ich war die letzten Jahre auf 10.0 Seattle, und da wurden die Padding-Bytes bei einer Zuweisung definitiv nicht mitkopiert. Zu anderen Versionen kann ich nichts sagen. Ist ja auch eigentlich eine gute Sache dass es (jetzt) so ist.

Ich habe nun in einer VM Delphi 10.0 ausprobiert. Auch da werden alle Bytes kopiert.

Beispielcode:
Delphi-Quellcode:
var
  test: PByte;
begin
  a.someByte := 1;
  a.someInteger := 1;
  test := @a.someByte;
  Inc(test);
  test^ := 42;
  b := a;
  test := @b.someByte;
  Inc(test);
  ShowMessage(IntToStr(test^));
Egal ob lokale Variablen oder globale Variablen, es kommt immer 42 heraus...

Der schöne Günther 15. Jun 2020 04:36

AW: Frage zu den "neuen" Records in 10.4
 
Tut mir leid für den vielen Aufwand den ich verursacht habe. Das hätte sich vermeiden lassen wenn ich erst einmal geschaut hätte was an meinen Tests genau fehlgeschlagen ist. Dann hätte ich auch nicht unsinnige Schlüsse gezogen wie dass bei einer Zuweisung das Padding nicht mitkopiert werden würde.

Um genau zu sein ging es um Padding-Bytes am Schluss eines Records. Beispiel:

Delphi-Quellcode:
TPaddingAtEnd = record
  a:   Integer;
  b:   Byte;
end;
Hier war unter 10.4 das Padding hinten immer 0xFF und in den Tests wurde dann das Padding bei Record A auf 0xFF gesetzt und erwartet dass die Bytes ungleich waren mit denen von Record B. In 10.0 scheint das Padding hinten allerdings wie erwartet zufällig zu sein.

Für die ganz interessierten:

Delphi-Quellcode:
paddingAtEnd1.a := 10;
paddingAtEnd1.b := 99;
paddingAtEnd2 := paddingAtEnd1;
TRecordHelper.FillPaddingBytes(paddingAtEnd1, $FF);
CheckFalse( isBytewiseEqual(paddingAtEnd1, paddingAtEnd2) );
wobei

Delphi-Quellcode:
function TestRecordHelper.isBytewiseEqual<T>(const a, b: T): Boolean;
var
   comparer: IEqualityComparer<T>;
begin
   comparer := TEqualityComparer<T>.Default();
   Result := comparer.Equals(a, b);
end;
Das
Delphi-Quellcode:
CheckFalse(..)
schlug jetzt in 10.4 fehl da die beiden
Delphi-Quellcode:
paddingAtEnd
-Records schon von Anfang an am Schluss FFs hatten. Ich habe das Muster in den Tests jetzt gegen 0xAA, 0xBB usw getauscht und die Welt scheint wieder in Ordnung zu sein.

jaenicke 15. Jun 2020 05:09

AW: Frage zu den "neuen" Records in 10.4
 
Liste der Anhänge anzeigen (Anzahl: 2)
Ich hatte dort auch schlicht angeschaut was genau bei der Zuweisung im Speicher passiert, auch bei einem größeren Record:
Anhang 52678
Anhang 52679
Dort kann man sehr gut sehen, dass die 42=$2A mitkopiert wird und auch warum (zweimal mov auf 4 Byte).

himitsu 15. Jun 2020 11:04

AW: Frage zu den "neuen" Records in 10.4
 
Hier wird direkt ein MOVE reinoptiermiert, da der Record klein ist und keine "schlimmen" Typen ethält.

Nimm für den Test auch mal einen String, Interface, Variant oder DynArray mit in den Record auf,
damit die CopyFunktionen aus System benutzt werden. (CopyRecord, bzw. CopyArray mit Länge 1)

Der schöne Günther 15. Jun 2020 11:24

AW: Frage zu den "neuen" Records in 10.4
 
Ja, hier war wieder ein einfaches Weltbild am Werk, gemanagte Typen kommen in den Tests gar nicht vor. Danke! 👍


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:28 Uhr.
Seite 2 von 2     12   

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