Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Seltsame Berechnung mit <sizeOf> (https://www.delphipraxis.net/28171-seltsame-berechnung-mit-sizeof.html)

Dannyboy 20. Aug 2004 12:39


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:
  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ääääää??
Das möge man mir bitte erklären. :gruebel:

Dani 20. Aug 2004 12:41

Re: Seltsame Berechnung mit <sizeOf>
 
Hi,

probier statt record den packed record

Zitat:

Zitat von Onlinehilfe
Per Voreinstellung sind die Werte in einem strukturierten Typ in einem Word- oder Double-Word-Raster ausgerichtet, um den Zugriff zu beschleunigen. Wenn Sie einen strukturierten Typ deklarieren, können Sie das reservierte Wort packed einfügen, um die Daten in komprimierter Form zu speichern:


NicoDE 20. Aug 2004 12:43

Re: Seltsame Berechnung mit <sizeOf>
 
Delphi-Quellcode:
type
  TLevelSize = record
    Width : Int64; // 8 Bytes
    Height: Word; // 8 Bytes
  end;
Die Ausrichtung findet anhand des größten Members statt. Die Ausrichtung wirkt sich (beim Delphi-Compiler) auch auf das 'Ende' des Records aus.

Dannyboy 20. Aug 2004 13:04

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?

NicoDE 20. Aug 2004 13:08

Re: Seltsame Berechnung mit <sizeOf>
 
Zitat:

Zitat von Dannyboy
dass die Performance nicht darunter leidet.

Auf einem x86 wird es nicht auffallen. Auf Alpha/PPC (Windows NT 4.0) wird der Zugriff auf ein array of TFoo langsamer sein. Auf einem AMD64 (Windows x64) gibt es das gleiche Problem wie beim Alpha und PPC.
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.

nailor 20. Aug 2004 13:08

Re: Seltsame Berechnung mit <sizeOf>
 
es wird voraussichtlich langsamer. aber nicht so schrecklich viel.

edit:
Delphi-Quellcode:
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.
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.

Dannyboy 20. Aug 2004 13:15

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:

Luckie 20. Aug 2004 13:15

Re: Seltsame Berechnung mit <sizeOf>
 
Zitat:

Zitat von Dannyboy
Hi Dani, hi NicoDe,
seltsamerweise speichert er die 16 Bytes dann auch
in der Datei! Das gefällt mir nicht so.

Äh, wie meinen? Wie speicherst du denn das bitte? Dass der Datensatz 16 byte groß ist? Ist ja auch irgendwie logisch oder?

nailor 20. Aug 2004 13:16

Re: Seltsame Berechnung mit <sizeOf>
 
siehe mein edit oben

Dannyboy 20. Aug 2004 13:26

Re: Seltsame Berechnung mit <sizeOf>
 
Zitat:

Zitat von Luckie
Äh, wie meinen? Wie speicherst du denn das bitte? Dass der Datensatz 16 byte groß ist? Ist ja auch irgendwie logisch oder?

Moin Luckie,
logisch erscheint mir eher, dass int64 (8 Bytes) + word (2 bytes) insgesamt 10 Bytes ergeben.
Delphi-Quellcode:
var lSize : TLevelSize;
//...
Filestream.write(lSize, sizeOf(TLevelSize)); // 16 Bytes
//...
Wie gesagt, ich werde die Daten jetzt einzeln ein - und einzeln auslesen. Spricht was für
einen anderen Vorschlag? :gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:34 Uhr.
Seite 1 von 3  1 23      

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