![]() |
Pointer SizeOf
Vielleicht bin ich ja total dumm im Kopf, aber ich hätt da mal ne Grundlagenfrage zum Thema Zeiger
Also, mit SiteOf() kann man ja die Größe einer Variable oder den von einem Zeiger reservierten/eingenommenen Speicherplatz herausbekommen. Bei mir liefert SizeOf aber das gleiche Ergebnis für folgendes zurück: 1. der Zeiger wurde zwar definiert, für ihn aber kein Speicher auf dem Heap (mit New() und Dispose()) angelegt 2. der Zeiger wurde definiert, der Speicher auf dem Heapt angelegt und in diesen Speicher geschrieben Das kann doch eigentlich gar nicht sein oder? Im ersten Fall müsste der Zeiger doch auf NIL zeigen, also SizeOf() 0 zurückgeben... sonst könnte man ja gleich Variabelen benutzen, wenn Zeiger immer schon bei ihrer deklaration Speicher reservieren... So liefern aber 1. und 2. das gleiche Ergebnis (in meinem Fall 12 (Byte)) zurück |
Re: Pointer SizeOf
SizeoOf betrachtet nicht den wirklich belegten Speicher, sondern den Speicher der eine Struktur, wenn sie erzeugt wird.
|
Re: Pointer SizeOf
Normalerweise hat ein Zeiger 4 Byte, wenns ein Methodenzeiger ist 8 Byte.
|
Re: Pointer SizeOf
ersma vielen dank für die wie immer kompetente hilfe!
...und ich dachte schon ich bin total doof un hab irgendwas falsch definiert... wie kann ich den tatsächlich belegten speicher herausbekommen? da muss es doch auch nen befehl für geben oder??? |
Re: Pointer SizeOf
Du kannst nur auf Nil Prüfen und hoffen, das richtig freigegeben wurde (FreeAndNil)
|
Re: Pointer SizeOf
aber dann weiß ich ja nicht, wieviel speicher momentan auf dem heap belegt wird... un das wollt ich nu eigentlich wissen, ohne es ausrechnen zu müssen
|
Re: Pointer SizeOf
also hab ich keine chance an die größe des aktuell belegten speichers zu kommen oder wie is das?
|
Re: Pointer SizeOf
Hi,
wenn du einen typisierten Zeiger p hast, dann liefert dir SizeOf(p) die Größe des Zeigers (4 Byte) und SizeOf(p^) die Größe des Speicherbereichs, auf den der Zeiger verweist.
Delphi-Quellcode:
Es spielt dabei keine Rolle, ob der Zeiger initialisiert wurde oder nicht. Der Compiler kennt aufgrund der Typvereinbarungen die Größe der Speicherblöcke und setzt die entsprechenden Werte ein.
type
PStructure = ^TStructure; TStructure = record i, j, k : Integer; end; var p : PStructure; size : Integer; begin p := nil; size := SizeOf(p); // size = 4 size := SizeOf(p^); // size = 12 end; Gruß Hawkeye |
Re: Pointer SizeOf
alles klar, das heißt also, dass ich niemals den tatsächlich belegten speicher zurückgeliefert bekomme... naja, auch nich sooo schlimm
danke für all eure antworten! |
Re: Pointer SizeOf
Zitat:
Gruß Hawkeye |
Re: Pointer SizeOf
Zitat:
Delphi-Quellcode:
Die Größe einer Klasse kriegst du mit
function GetAllocatedHeap: Integer;
begin Result:=GetHeapStatus.TotalAllocated; end; ![]() |
Re: Pointer SizeOf
Zitat:
SizeOf hat mit dynamisch alloziiertem Speicher nichts am Hut. SizeOf() liefert die Groesse eines Typs oder einer Variable. Es wird zur Compile-Zeit ausgerechnet. SizeOf(Pointer) ist also immer 4 egal wohin der Zeiger zeigt. Auch Methoden-Zeiger haben die Groesse 4. Sie zeigen nur auf ein Record das zwei weitere Zeiger enthaelt. Dieses Record hat dann die Groesse 8. |
Re: Pointer SizeOf
Hallo Robert,
Zitat:
![]() Gruß Hawkeye |
Re: Pointer SizeOf
Hmmm... ich glaub ihr kommt grad vom Thema weg... :zwinker:
|
Re: Pointer SizeOf
Zitat:
|
Re: Pointer SizeOf
Das ist nicht der Methodenzeiger, sondern das Record selbst. Es besteht also nur eine begriffliche Verwirrung.
|
Re: Pointer SizeOf
öhm, also sizeof liefert definitiv nicht den tatsächlcih belegten speicher zurück, sonst hätte ich dir frage ja niemals im forum stellen müssen... aber das is ja nu auch wurscht, man kann ja mit ein bissl mehraufwand ausrechnen wieviel speicher belegt wird (einfach die new/dispose vorgänge zusammenrechnen)
|
Re: Pointer SizeOf
*hüstel*
![]() Da kannst du sämtlichen belegten Speicher mit der Funktion, die ich da geschrieben habe, ermitteln. |
Re: Pointer SizeOf
huuups... hatte ich mal wieder ganz übersehen. aber ermittelt das auch nur den von meiner anwendung belgetn speicher oder den ges geamten systems? (wenn ichs ausprobiert hätte eüßt ichs schon, aber ein programmierer darf auch faul sein^^)
danke nochma für den verweis :wink: |
Re: Pointer SizeOf
Natürlich nur den von deiner.
EDIT: Und auch nur den Heap, nicht den Stack. |
Re: Pointer SizeOf
Der Fehler liegt im Begriff Methodenzeiger. Delphi handhabt hier einfach ein Record ganz normal.
|
Re: Pointer SizeOf
Zitat:
|
Re: Pointer SizeOf
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:24 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 by Thomas Breitkreuz