Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi C Code in Delphi Code wandeln (https://www.delphipraxis.net/136756-c-code-delphi-code-wandeln.html)

ken_jones 7. Jul 2009 14:22


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:
void* mem = speedallocator->Allocate(sizeof(GroundStructure));
return new (mem) GroundStructure(def);
Also, der speedallocator reserviert mir auf etwas geschicktere Art und Weise etwas Speicher und liefert mir einen Zeiger darauf zurück.
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!!

Luckie 7. Jul 2009 14:24

Re: C Code in Delphi Code wandeln
 
In der zweiten Zeile wird eine Instanz von GroundStructure erzeugt aber nach mem gecastet.

DSFreak 7. Jul 2009 14:59

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);

ken_jones 7. Jul 2009 16:23

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?

DSFreak 7. Jul 2009 17:48

Re: C Code in Delphi Code wandeln
 
Fast richtig, nur ist das kein Cast, sondern ein sogenanntes Bei Google suchenplacement new.

ken_jones 8. Jul 2009 17:39

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?

Dax 8. Jul 2009 17:54

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(...);

ken_jones 8. Jul 2009 18:16

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:
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;
Hab grad kein Delphi zur Hand, muss das später ausprobieren...

[Edit]SizeOf(TGroundStructure) in TGroundStructure.InstanceSize geändert[/Edit]

DSFreak 8. Jul 2009 20:48

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.

Dax 8. Jul 2009 21:33

Re: C Code in Delphi Code wandeln
 
Zitat:

Zitat von DSFreak
Ich glaube kaum, dass der SpeedAllocator schneller ist als new.

Das sei mal dahingestellt. Afair ist die Standardimplementation von new ein malloc mit nachfolgendem Aufruf des Konstruktors auf den reservierten Speicher. Der SpeedAllocator könnte - wie FastMM - einfach größere Speicherblöcke anfordern und diese bei neuen Aufrufen entsprechend zerstückelt zurückgeben. Wenn dann die Objekte schnell erzeugt und zerstört werden, kann ein solcher MM den verwendeten Speicher wieder dem Pool hinzufügen und neue Requests aus dem Pool bedienen: pro Poolhit spart man einen Syscall. Das spart massig Zeit.

Cyf 8. Jul 2009 22:53

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++...

ken_jones 9. Jul 2009 07:57

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: Small Block Allocator

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:

Zitat von Cyf
Nebenbei bemerkt ist das ja eigentlich C++..

You're right!

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 18:15 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz