AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Frage zu den "neuen" Records in 10.4

Ein Thema von Der schöne Günther · begonnen am 13. Jun 2020 · letzter Beitrag vom 15. Jun 2020
Antwort Antwort
Seite 2 von 2     12
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
7.718 Beiträge
 
Delphi 10.4 Sydney
 
#11

AW: Frage zu den "neuen" Records in 10.4

  Alt 14. Jun 2020, 21:22
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...
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
5.387 Beiträge
 
Delphi 10 Seattle Enterprise
 
#12

AW: Frage zu den "neuen" Records in 10.4

  Alt 15. Jun 2020, 05:36
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 CheckFalse(..) schlug jetzt in 10.4 fehl da die beiden 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.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
7.718 Beiträge
 
Delphi 10.4 Sydney
 
#13

AW: Frage zu den "neuen" Records in 10.4

  Alt 15. Jun 2020, 06:09
Ich hatte dort auch schlicht angeschaut was genau bei der Zuweisung im Speicher passiert, auch bei einem größeren Record:
recordcopy.png
recordcopy1.png
Dort kann man sehr gut sehen, dass die 42=$2A mitkopiert wird und auch warum (zweimal mov auf 4 Byte).
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
36.854 Beiträge
 
Delphi 10.4 Sydney
 
#14

AW: Frage zu den "neuen" Records in 10.4

  Alt 15. Jun 2020, 12:04
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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Der schöne Günther

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

AW: Frage zu den "neuen" Records in 10.4

  Alt 15. Jun 2020, 12:24
Ja, hier war wieder ein einfaches Weltbild am Werk, gemanagte Typen kommen in den Tests gar nicht vor. Danke! 👍
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 00:02 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf