![]() |
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:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:45 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