![]() |
C Code in Delphi Code wandeln
Ich hab ein grosses Projekt, welches ich von CPP nach Delphi portieren muss. Jetzt bin ich auf eine Stelle gestossen, bei welcher ich den Syntax von C nicht ganz begreife:
Delphi-Quellcode:
Also, der speedallocator reserviert mir auf etwas geschicktere Art und Weise etwas Speicher und liefert mir einen Zeiger darauf zurück.
void* mem = speedallocator->Allocate(sizeof(GroundStructure));
return new (mem) GroundStructure(def); Die erste Zeile reserviert mir also genügend Speicher für die "GroundStructure". Die zweite Zeile begreife ich überhaupt nicht. Sieht so aus, als ob C hier ein NEW macht, bei dem kein Speicher reserviert wird, sondern eine Instanz von "GroundStructure" im Speicherbereich von "mem" erstellt. Die Frage ist nun: a) Stimmt meine Vermutung und b) Wie setze ich das am einfachsten in Delphi um? Danke für Hilfe!! |
Re: C Code in Delphi Code wandeln
In der zweiten Zeile wird eine Instanz von GroundStructure erzeugt aber nach mem gecastet.
|
Re: C Code in Delphi Code wandeln
Nein. In der zweiten Zeile wird eine Instanz von GroundStructure an der Stelle, wo mem hinzeigt, erzeugt. Deshalb ist die erste Zeile irgendwie unnötig. oO
Ich verstehe echt nicht, was so ein SpeedAllocator besser machen könnte als "new". Man könnte einfach schreiben:
Code:
return new GroundStructure(def);
|
Re: C Code in Delphi Code wandeln
Vielen Dank erstmal euch beiden!
Hab das ganze jetzt nochmals angeschaut. Der "SpeedAllocator" reserviert wirklich (Malloc) Speicher in der Grösse des "GroundStructure". "New" macht dies meines Erachtens ebenfalls. Damit ich das jetzt richtig verstehe: Es wird somit 2x Speicher reserviert, aber durch den Cast am selben Ort? |
Re: C Code in Delphi Code wandeln
Fast richtig, nur ist das kein Cast, sondern ein sogenanntes
![]() |
Re: C Code in Delphi Code wandeln
Ok, vielen Dank nochmals! Hab mich jetzt ein bisschen schlau gelesen wie's in C funktioniert.
Aber ich habs noch nicht raus, wie ich dasselbe in Delphi hinkrieg. Ob mit New, Create, class function NewInstance, etc., es gibt keinen mir bekannten Weg ein Objekt zu instantiieren ohne Speicher zu allozieren. Hat jemand noch einen Trick auf Lager? |
Re: C Code in Delphi Code wandeln
Ich glaube, dass jede Klasse eine statische Methode/Property ClassSize hat - und wenn nicht unter dem Namen, dann sicher ein ähnlicher, der Wert wird nämlich von NewInstance benutzt.
Der einzige Unterschied zwischen class.Create und instance.Create war, meiner Erinnerung nach, ein Aufruf von NewInstance. Also:
Delphi-Quellcode:
var mem: TIrgendwas;
mem := TIrgendwas(GetMem(TIrgendwas.ClassSize)); mem.Create(...); |
Re: C Code in Delphi Code wandeln
Hmm, kann deinen Gedanken nicht ganz folgen. Meinst du etwas in dieser Richtung (kam mir beim lesen deines Beitrags in den Sinn)?
Delphi-Quellcode:
Hab grad kein Delphi zur Hand, muss das später ausprobieren...
var
gs : TGroundStructure; pPointer : Pointer; begin GetMem(pPointer, TGroundStructure.InstanceSize); // <- später dann dieser SpeedAllocator gs := TGroundStructure.InitInstance(pPointer) as TGroundStructure; gs.create(...blabla); gs.Free; end; [Edit]SizeOf(TGroundStructure) in TGroundStructure.InstanceSize geändert[/Edit] |
Re: C Code in Delphi Code wandeln
Nochmal: Man braucht hier kein placement new, da dieser SpeedAllocator wohl nur Speicher reserviert, was new (bzw. gs.Create) schon selber macht.
Daher reicht es, die Create-Prozedur aufzurufen. Ich glaube kaum, dass der SpeedAllocator schneller ist als new. |
Re: C Code in Delphi Code wandeln
Zitat:
|
Re: C Code in Delphi Code wandeln
Das kann wohl schneller sein und auch für einen garbage collector genutzt werden, soll hier das selbe Objekt durch ein neues ersetzt werden, so kann einfach der alte Speicherbereich (der ja immer an der selben Stelle auf dem Heap ist) mit dem neuen Objekt überschrieben werden und zudem kann vom Verwaltungsobjekt sichergestellt werden, dass der Speicher beim Beenden (oder wann auch immer) wirklich freigegeben wird. Zudem können wie schon angemerkt im Vorraus größere Speicherblöcke als nötig angefordert und dann selbst verwaltet werden. Hierbei kommt es halt darauf an, wie der SpeedAllocator implementiert ist.
Nebenbei bemerkt ist das ja eigentlich C++... |
Re: C Code in Delphi Code wandeln
So, ich hab den SpeedAllocator detailliert unter die Lupe genommen und folgendes herausgefunden:
Der Code des SpeedAllocators entspricht ziemlich genau diesem Code hier: ![]() Einerseits behauptet der Author mit dem Small Block Allocator bis zu 25x schneller zu sein, andererseits (auch wenn die Aussage ziemlich Euphorisch ist) muss ich das fast glauben. Gut, vielleicht nicht 25x, aber auf alle Fälle schneller. Denn wenn wirklich viele Objekte, und ich mein viele,erstellt werden, dann reicht ein einziger Malloc für vielleicht 1000 Objekte aus. Und mit geschicktem Handling kann ich den Speicherplatz wiederverwenden, ohne Free/Malloc. Kurzum, ich werde den SpeedAllocator in Delphi umsetzen, ich glaub da gibt es genug Sinn dahinter. Zitat:
Wenn ich heute dazukomme, werde ich mal mit InitInstance etwas herumspielen, ich glaub da bin ich auf dem richtigen Weg um das in Delphi umzusetzen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:15 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