Delphi-PRAXiS
Seite 1 von 2  1 2      

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:10 Uhr.
Seite 1 von 2  1 2      

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