Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Speicherbedarf Datenverbund? (https://www.delphipraxis.net/133356-speicherbedarf-datenverbund.html)

Bernhard Geyer 30. Apr 2009 09:05

Re: Speicherbedarf Datenverbund?
 
Zitat:

Zitat von mkinzler
In seinem Fall sind es wohl 2 Bytes

Oder auch 4 Bytes sein. Kommt für den o.g. Record aufs gleiche raus.

himitsu 30. Apr 2009 09:16

Re: Speicherbedarf Datenverbund?
 
Zitat:

Zitat von mkinzler
In seinem Fall sind es wohl 2 Bytes

dann hat er wohl was verstellt? :gruebel:
(D7 und D2009 machen bei der Recordgröße per Standard 4)

Zitat:

Delphi-Quellcode:
type tpointer=^tdaten;
tdaten=record
  name: string[10];
  next: tpointer;
end;

gemessen: (obwohl in D2009 eigentlich QuadWord in den Projekttionen eingestellt ist :gruebel: und selbst ein {$A8} hat keine Auswirkung darauf ... aber zumindestens {$A1} läßt es PACKED sein)
Zitat:

string[6] = 12 Byte
string[8] = 16 Byte
string[10] = 16 Byte
string[12] = 20 Byte
[add]
Delphi-Quellcode:
{$A8}

type tpointer=^tdaten;
tdaten=record
  name: string[2];
  next: tpointer;
end;
müßte doch mindestens 8(3) + 4 Byte sein, wenn "next" an der nächsten 8 Byte-Genze liegen würde?

Lotus 1. Mai 2009 08:59

Re: Speicherbedarf Datenverbund?
 
Ich persönlich möchte gar nichts mit diesem Datensatz anfangen. Es geht nur darum, das ich in ein paar Tagen meine Prüfung (Abitur) in Informatik ablegen muss und mein Lehrer stellt gern einmal solche Aufgaben wo man den Speicherbedarf ermitteln soll. Dürfte normalerweise kein Problem darstellen, aber nur um sicherzugehen wollte ich halt mit sizeof nachprüfen. Mit packed dürfte das ja nun ganz gut funktionieren.

Noch ne kurze Frage:

Bei Pointern haben wir gelernt das man 4Byte für den Zeiger selbst braucht.
Brauch ich diese 4 Byte nur einmal? Oder brauch ich diese 4Byte für die Anzahl meiner Datensätze?

Nach dem Datensatz oben (packed) haben wir ja einen Verbrauch von 15Byte.. hierzukommen dann diese 4Byte für den Pointer.. wenn ich jetzt 2datensaetze habe... brauch ich dann diese 4 byte noch ein zweites mal?

mkinzler 1. Mai 2009 09:07

Re: Speicherbedarf Datenverbund?
 
Eine 2. Pointer variable belegt wieder 4 Bytes

Bernhard Geyer 1. Mai 2009 09:09

Re: Speicherbedarf Datenverbund?
 
Zitat:

Zitat von Lotus
Bei Pointern haben wir gelernt das man 4Byte für den Zeiger selbst braucht.

Um mal kleinkarriert zu sein: 4 Byte sind es auf einem 32-Bit-System. Auf einem 64-Bit System (woh ja gerade der Wechsel erfolgt) sind es 8 Byte.

Lotus 1. Mai 2009 09:34

Re: Speicherbedarf Datenverbund?
 
ok danke sehr.. damit haben sich alle fragen geklärt!

himitsu 1. Mai 2009 11:25

Re: Speicherbedarf Datenverbund?
 
Zitat:

Zitat von Lotus
Ich persönlich möchte gar nichts mit diesem Datensatz anfangen. Es geht nur darum, das ich in ein paar Tagen meine Prüfung (Abitur) in Informatik ablegen muss und mein Lehrer stellt gern einmal solche Aufgaben wo man den Speicherbedarf ermitteln soll. Dürfte normalerweise kein Problem darstellen, aber nur um sicherzugehen wollte ich halt mit sizeof nachprüfen. Mit packed dürfte das ja nun ganz gut funktionieren.

Jupp, bei Packed brauchst du ja nur die Größen der Einzelteile bestimmen, zusammenrechnen und fertig.

Bei ungepackten/ausgerichteten Records:

der Beispielrecord:
Delphi-Quellcode:
daten = record
  S: String[10];
  B: Byte;
  i: Integer;
  K: Int64;
  P: Pointer;
  W: Word;
end;
entweder du stellst dir ein Raster vor

per Standard also mit 4 Byteschritten (Integergrenzen)
und richtest nacheinander die Elemente an den Grenzen aus
Delphi-Quellcode:
// packed / packed[1]     30 Byte
sSSSSSSSSSSBiiiiKKKKKKKKPPPPWW

// unpacked / packed[4]   36 Byte = 9 * 4[Integer]
1---2---3---4---5---6---7---8---9---
sSSSSSSSSSS B  iiiiKKKKKKKKPPPPWW

// unpacked / packed[8]   56 Byte = 7 * 8[Int64]
1-------2-------3-------4-------5-------6-------7-------
sSSSSSSSSSS    B      iiii   KKKKKKKKPPPP   WW

// unpacked / packed[2]   32 Byte = 16 * 2[Word]
1-2-3-4-5-6-7-8-9-0-1-2-3-4-5-6-
sSSSSSSSSSS B iiiiKKKKKKKKPPPPWW
oder du rundest jedes Element auf die Gittergrößen auf
und rechnest dieses nur noch zusammen

Code:
.               SizeOf/
                 packed  packed[4]  packed[8]  packed[2]
S: String[10];  11       3*4= 12     2*8= 16     6*2= 12
B: Byte;        1        1*4= 4      1*8= 8      1*2= 2
i: Integer;     4        1*4= 4      1*8= 8      2*2= 4
K: Int64;       8        2*4= 8      1*8= 8      4*2= 8
P: Pointer;     4        1*4= 4      1*8= 8      2*2= 4
W: Word;        2        1*4= 4      1*8= 8      1*2= 2
                 =30           =36         =56         =32


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:20 Uhr.
Seite 2 von 2     12   

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