![]() |
AW: Frage zu den "neuen" Records in 10.4
Zitat:
Beispielcode:
Delphi-Quellcode:
Egal ob lokale Variablen oder globale Variablen, es kommt immer 42 heraus...
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^)); |
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:
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.
TPaddingAtEnd = record
a: Integer; b: Byte; end; Für die ganz interessierten:
Delphi-Quellcode:
wobei
paddingAtEnd1.a := 10;
paddingAtEnd1.b := 99; paddingAtEnd2 := paddingAtEnd1; TRecordHelper.FillPaddingBytes(paddingAtEnd1, $FF); CheckFalse( isBytewiseEqual(paddingAtEnd1, paddingAtEnd2) );
Delphi-Quellcode:
Das
function TestRecordHelper.isBytewiseEqual<T>(const a, b: T): Boolean;
var comparer: IEqualityComparer<T>; begin comparer := TEqualityComparer<T>.Default(); Result := comparer.Equals(a, b); end;
Delphi-Quellcode:
schlug jetzt in 10.4 fehl da die beiden
CheckFalse(..)
Delphi-Quellcode:
-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.
paddingAtEnd
|
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). |
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) |
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. |
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