AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

C Code in Delphi Code wandeln

Ein Thema von ken_jones · begonnen am 7. Jul 2009 · letzter Beitrag vom 9. Jul 2009
Antwort Antwort
Seite 1 von 2  1 2      
ken_jones

Registriert seit: 16. Mai 2005
Ort: Luzern
154 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

C Code in Delphi Code wandeln

  Alt 7. Jul 2009, 14:22
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!!
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: C Code in Delphi Code wandeln

  Alt 7. Jul 2009, 14:24
In der zweiten Zeile wird eine Instanz von GroundStructure erzeugt aber nach mem gecastet.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
DSFreak

Registriert seit: 24. Apr 2008
9 Beiträge
 
#3

Re: C Code in Delphi Code wandeln

  Alt 7. Jul 2009, 14:59
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);
  Mit Zitat antworten Zitat
ken_jones

Registriert seit: 16. Mai 2005
Ort: Luzern
154 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

Re: C Code in Delphi Code wandeln

  Alt 7. Jul 2009, 16:23
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?
  Mit Zitat antworten Zitat
DSFreak

Registriert seit: 24. Apr 2008
9 Beiträge
 
#5

Re: C Code in Delphi Code wandeln

  Alt 7. Jul 2009, 17:48
Fast richtig, nur ist das kein Cast, sondern ein sogenanntes Bei Google suchenplacement new.
  Mit Zitat antworten Zitat
ken_jones

Registriert seit: 16. Mai 2005
Ort: Luzern
154 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

Re: C Code in Delphi Code wandeln

  Alt 8. Jul 2009, 17:39
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?
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#7

Re: C Code in Delphi Code wandeln

  Alt 8. Jul 2009, 17:54
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(...);
  Mit Zitat antworten Zitat
ken_jones

Registriert seit: 16. Mai 2005
Ort: Luzern
154 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

Re: C Code in Delphi Code wandeln

  Alt 8. Jul 2009, 18:16
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]
  Mit Zitat antworten Zitat
DSFreak

Registriert seit: 24. Apr 2008
9 Beiträge
 
#9

Re: C Code in Delphi Code wandeln

  Alt 8. Jul 2009, 20:48
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.
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#10

Re: C Code in Delphi Code wandeln

  Alt 8. Jul 2009, 21:33
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:23 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