![]() |
Seltsame Berechnung mit <sizeOf>
Hallo Freunde des kleinen Ein-Mal-Eins,
wenn ich mir ansehe, dass laut der Funktion <sizeOf> 8 + 2 zu dem Resultat 16 kommt, dann frage ich mich, ob ich bisher im Themengebiet der Mathematik etwas verpasst habe. Ich dachte immer, ich hätte das kleine Ein-Mal-Eins drauf :mrgreen: Folgendes Problem:
Delphi-Quellcode:
Das möge man mir bitte erklären. :gruebel:
var b : byte;
//... b:= SizeOf(int64); // b = 8; b:= SizeOf(word); // b = 2; // Bis hier hin is' alles cool, aber ... type TLevelSize = record width : int64; // 8 Bytes height : word; // 2 Bytes end; //... b:= SizeOf(TLevelSize) // b = 16 // hääääää?? |
Re: Seltsame Berechnung mit <sizeOf>
Hi,
probier statt record den packed record Zitat:
|
Re: Seltsame Berechnung mit <sizeOf>
Delphi-Quellcode:
Die Ausrichtung findet anhand des größten Members statt. Die Ausrichtung wirkt sich (beim Delphi-Compiler) auch auf das 'Ende' des Records aus.
type
TLevelSize = record Width : Int64; // 8 Bytes Height: Word; // 8 Bytes end; |
Re: Seltsame Berechnung mit <sizeOf>
Hi Dani, hi NicoDe,
seltsamerweise speichert er die 16 Bytes dann auch in der Datei! Das gefällt mir nicht so. Wenn ich einen Packed Record verwende, hoffe ich, dass die Performance nicht darunter leidet. Weil dann wäre das alles umsonst. Was meint ihr? |
Re: Seltsame Berechnung mit <sizeOf>
Zitat:
Das Schreiben der Records ist davon nicht betroffen. ps: als Anhaltspunkt für Windows x64 (AMD64/EMT64), die Performance könnte im ungünstigen Fall auf ca. die Hälfte sinken. |
Re: Seltsame Berechnung mit <sizeOf>
es wird voraussichtlich langsamer. aber nicht so schrecklich viel.
edit:
Delphi-Quellcode:
sorry für scheiss formatierung. aber in dem fall sinds ca 30% verlust. wenn man die arrays wegmacht, und immer auf dem gleichen record rumschreibt, dann gehts in der packed version sogar schneller.
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TLevelSize = record Width : Int64; // 8 Bytes Height: Word; // 8 Bytes end; type TLevelSize2 = packed record Width : Int64; // 8 Bytes Height: Word; // 8 Bytes end; TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); const max = 10000; var i,j: integer; t: cardinal; a: array[0..max] of tlevelsize; b: array[0..max] of tlevelsize2; begin {$O-} t:= gettickcount; for i := 0 to max do begin for j := 0 to max do begin a[i].Width := 0; a[i].Height := 0; end; end; showmessage(inttostr(gettickcount - t)); t:= gettickcount; for i := 0 to max do for j := 0 to max do begin begin b[i].Width := 0; b[i].Height := 0; end; end; showmessage(inttostr(gettickcount - t)); end; end. |
Re: Seltsame Berechnung mit <sizeOf>
Igitt !!! :kotz:
Nö, bei Performanceverlust werde ich auf den Record verzichten und die Daten eher sequentiell ein - und auslesen, ergo erst <width>, dann <height>. So einfach ist das! :evil: |
Re: Seltsame Berechnung mit <sizeOf>
Zitat:
|
Re: Seltsame Berechnung mit <sizeOf>
siehe mein edit oben
|
Re: Seltsame Berechnung mit <sizeOf>
Zitat:
logisch erscheint mir eher, dass int64 (8 Bytes) + word (2 bytes) insgesamt 10 Bytes ergeben.
Delphi-Quellcode:
Wie gesagt, ich werde die Daten jetzt einzeln ein - und einzeln auslesen. Spricht was für
var lSize : TLevelSize;
//... Filestream.write(lSize, sizeOf(TLevelSize)); // 16 Bytes //... einen anderen Vorschlag? :gruebel: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:34 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