![]() |
Speicherbedarf Datenverbund?
Servus,
ich habe folgende Typdeklartionen:
Delphi-Quellcode:
Für mich wären dies ein Speicherbedarf von 15Byte (11 für String+4Byte für den Pointer)
type tpointer=^tdaten;
tdaten=record name:string[10]; next:tpointer; end; Delphi gibt mir allerdings per sizeof(tdaten) eine größe von 16 Byte aus... warum? Bzw. welches Ergebnis ist nun richtig? [edit=mkinzler]Delphi-Tag eingefügt Mfg, mkinzler[/edit] |
Re: Speicherbedarf Datenverbund?
Es wird auf auf Word-Grenzen ausgerichtet. 15Bytes wäre es bei packed
|
Re: Speicherbedarf Datenverbund?
Kann ich sizeof so einstellen das es nur packed ausgibt? bzw. wo is der unterschied von packed?
|
Re: Speicherbedarf Datenverbund?
Das Schlüsselwort 'packed' weist den Compiler an, die Felder bytegenau anzuordnen. Dann ist der Zugriff aber etwas langsamer. Ohne diesen Zusatz werden die Felder (aus Gründen der Performance) -wie mkinzler schon sagte- 16bit-weise angeordnet.
'SizeOf' kann man nicht 'einstellen' :gruebel: |
Re: Speicherbedarf Datenverbund?
Gäbe es noch eine andere Methode den Speicherbedarf (packed) auszugeben?
|
Re: Speicherbedarf Datenverbund?
Was gefällt dir an packed nicht?
Warum ist die das eine Byte so wichtig? |
Re: Speicherbedarf Datenverbund?
Zitat:
Delphi-Quellcode:
Auf diese Weise wird der Speicher anders angeordnet (eben nicht mehr wortweise) und der Speicherbedarf ändert sich entsprechend. Geht, wie schon von den Vorrednern geschrieben, etwas zu Lasten der Performance.
tdaten = packed record
name : string[10]; next : tpointer; end; |
Re: Speicherbedarf Datenverbund?
Zitat:
Bei neueren Delphi-Versionen ist hier der Default-Wert 8 Byte. Dies ist auch für neuerer Prozessoren (Pentium (?) und neuer) auch besser da hier die Prozessorarchitektur schon auf 64-Bit Speicherzugriff ausgerichtet ist). |
Re: Speicherbedarf Datenverbund?
Zitat:
Zitat:
Test: versuch es einfach mal mit string[8] :angel2: jupp, die Ausrichtung mußt du direkt am Record einstellen, also Packed oder nicht und wenn nicht, dann greift hier als Erstes das aktuell in der Unit gültige/letzte {$A...} bzw. {$ALIGN ...} (siehe OH) und wenn da nichts steht, dann das aus den Projektoptionen. Zitat:
PACKED besagt ... ach, schau einfach mal bei ![]() |
Re: Speicherbedarf Datenverbund?
Zitat:
|
Re: Speicherbedarf Datenverbund?
Zitat:
|
Re: Speicherbedarf Datenverbund?
Zitat:
(D7 und D2009 machen bei der Recordgröße per Standard 4) Zitat:
Zitat:
Delphi-Quellcode:
müßte doch mindestens 8(3) + 4 Byte sein, wenn "next" an der nächsten 8 Byte-Genze liegen würde?
{$A8}
type tpointer=^tdaten; tdaten=record name: string[2]; next: tpointer; end; |
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? |
Re: Speicherbedarf Datenverbund?
Eine 2. Pointer variable belegt wieder 4 Bytes
|
Re: Speicherbedarf Datenverbund?
Zitat:
|
Re: Speicherbedarf Datenverbund?
ok danke sehr.. damit haben sich alle fragen geklärt!
|
Re: Speicherbedarf Datenverbund?
Zitat:
Bei ungepackten/ausgerichteten Records: der Beispielrecord:
Delphi-Quellcode:
entweder du stellst dir ein Raster vor
daten = record
S: String[10]; B: Byte; i: Integer; K: Int64; P: Pointer; W: Word; end; per Standard also mit 4 Byteschritten (Integergrenzen) und richtest nacheinander die Elemente an den Grenzen aus
Delphi-Quellcode:
oder du rundest jedes Element auf die Gittergrößen auf
// 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 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:09 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