![]() |
Delphi-Version: 10.4 Sydney
Frage zu den "neuen" Records in 10.4
Ich habe die Entwicklung nicht wirklich mitverfolgt, jetzt sind sie da.
Was mir auffällt ist dass früher ™ bei
Delphi-Quellcode:
die Felder kopiert wurden, mehr nicht. Sieht beispielsweise mein Record so aus
meinRecord1 := meinRecord2
Delphi-Quellcode:
dann sind zwischen dem Byte und dem Integer (bei üblicher Compiler-Optimierung) 3 "Padding-Bytes" Platz. Die wurden nicht mitkopiert. Jetzt scheint das der Fall zu sein.
TMyRecord = record
someByte: Byte; someInteger: Integer end; Hat das einen Grund? Muss ich mich vorsehen? Ich habe unter ![]() nichts darüber gefunden. |
AW: Frage zu den "neuen" Records in 10.4
Schonmal mit packed records probiert ?
Ich verstehe das so dass Alles wie bisher bleiben soll, Nur das man zusätzlich selbst noch das Kopierverhalten steuern kann. Im Default müsste man aber nichts anfassen, damit es kompatibel zu altem Code bleibt. Ich habe aber noch nicht explizit damit rumprobiert, sondern versuche erstmal Projekte komplett zu portieren und zu testen. |
AW: Frage zu den "neuen" Records in 10.4
Bei
Delphi-Quellcode:
gibt es gar kein Padding, das ist ja der Sinn der Dinger.
packed record
Ich habe ja auch gar kein konkretes Problem das ich lösen muss (außer dass unter 10.4 jetzt ein paar Unit-Tests fehlschlagen), ich würde nur gerne wissen ob jemand evtl. ein Beispiel vorstellen kann, wo das neue Verhalten eine Rolle spielt. |
AW: Frage zu den "neuen" Records in 10.4
Was genau meinst Du mit "mitkopiert" ?
Ist vorher Padding drin, hinterher nicht ? |
AW: Frage zu den "neuen" Records in 10.4
Zitat:
|
AW: Frage zu den "neuen" Records in 10.4
Mit unsauberem Stil hat das nichts zutun.
Die neuen Möglichkeiten für Records erlauben es, diese z.B. automatisch zu initialisieren - mit Werten Deiner Wahl. Und über den Assign-Operator lässt sich das Kopier-Verhalten steuern. Gerade bei komplexen Typen kann hier Bedarf entstehen. |
AW: Frage zu den "neuen" Records in 10.4
Zitat:
|
AW: Frage zu den "neuen" Records in 10.4
Zitat:
Das hätte ja bedeutet das der Vorteil des einfacheren Zugriffs hinweg gewesen wäre bei jedem Kopiervorgang. Denn via Move einfach den Speicher von A nach B kopieren ist doch viel schneller als jedes einzelne Feld des Records unter Beachtung seines Datentyps einzeln zu kopieren. Das würde ich mit Schildbürgertum vom feinsten vergleichen. ... und kann ich mir nicht vorstellen. |
AW: Frage zu den "neuen" Records in 10.4
Zitat:
|
AW: Frage zu den "neuen" Records in 10.4
Zitat:
Delphi-Quellcode:
mit der Definition
myRecordA, myRecordB: TMyRecord
Delphi-Quellcode:
Und sagen wir myRecordA liegt beispielsweise so im Speicher:
TMyRecord = record
someByte: Byte; someInteger: Integer end;
Code:
Dann wurden früher ™ bei einer Zuweisung
Byte # Wert Gehört zu
0 42 someByte 1 FF (Padding) 2 FF (Padding) 3 FF (Padding) 4 00 someInteger 5 00 someInteger 6 00 someInteger 7 00 someInteger
Delphi-Quellcode:
nur die Bytes 0 und 4-7 in myRecordB gesetzt. Jetzt sind es alle.
myRecordB := myRecordA
Zitat:
|
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 12:36 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