AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)
Thema durchsuchen
Ansicht
Themen-Optionen

und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)

Ein Thema von Bladefire · begonnen am 28. Jul 2014 · letzter Beitrag vom 1. Aug 2014
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
755 Beiträge
 
#11

AW: und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)

  Alt 30. Jul 2014, 12:23
In C++ kann man auch eine Klasse ohne den ganzen Zeiger / referenzen kram erstellen. Wie würde das in Delphi aussehen?
Wie schon von Mikkey geschrieben, gibt es dafür in Delphi und C# kein Pendant, da dort Objekte (Instanzen von Klassen) immer nur eine Referenz auf einen Speicherbereich sind und man dadurch den Vorteil hat, es nicht explizit dereferenzieren zu müssen (Der Nachteil ist, man muss die Objekte immer selber erstellen / Speicher anfordern (create) und bei Delphi unter Windows auch wieder freigeben).

Am Ehesten kannst due es mir Records in Delphi vergleichen.
  Mit Zitat antworten Zitat
Bladefire

Registriert seit: 30. Jun 2014
67 Beiträge
 
#12

AW: und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)

  Alt 30. Jul 2014, 12:49
Danke, eure antworten haben mir sehr geholfen.

Ich möchte noch ein kleines beispiel einfügen das mir beim unterscheiden von obijektvariablen und obijektreferenzen geholfen hat:

Zitat:
sagen wir mal, ein Auto belegt 100 Bytes.

Auto myCar("BMW");
Compiler legt 100 Bytes auf dem Stack an und ruft dann den Konstruktor auf, dem er die Adresse des Anfangs des neuen Speichers übergibt.

Auto* myCar;
Compiler legt 4 Bytes auf dem Stack an
myCar = new Auto("BMW");
Compiler legt 100 Bytes auf dem Freispeicher an und ruft dann den Konstruktor auf, dem er die Adresse des Anfangs des neuen Speichers übergibt. Diese Adresse ist auch der Rückgabewert von new und wird in die 4 bytes auf dem Stack kopiert.
Quelle: http://www.c-plusplus.de/forum/155621-full - volkard

Also wird in delphi von natur aus alles bis auf den Zeiger im heap gespeichert?

Geändert von Bladefire (30. Jul 2014 um 13:02 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#13

AW: und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)

  Alt 30. Jul 2014, 13:55
Also wird in delphi von natur aus alles bis auf den Zeiger im heap gespeichert?
Wenn du Klassen-Instanzen in Delphi damit meinst, ja.

Wenn du das mit dem von C++ vergleichen möchtest, dann liegst du völlig falsch, denn in Delphi entspricht das den Records.
Delphi-Quellcode:
type
  THersteller = string[99];
  PAuto = ^TAuto;

  TAuto = record
    Hersteller : THersteller;
    constructor Create( Hersteller : THersteller );
  end;

  { TAuto }

constructor TAuto.Create( Hersteller : THersteller );
begin
  Self.Hersteller := Hersteller;
end;

procedure Test2;
var
  myCar : TAuto;
begin
  myCar := TAuto.Create( 'BMW' );
  Writeln( SizeOf( myCar ) ); // -> 100
end;

procedure Test3;
var
  myCar : PAuto;
begin
  myCar := New( PAuto );
  try
    myCar^ := TAuto.Create( 'BMW' );
    Writeln( SizeOf( myCar ) ); // -> 4
  finally
    Dispose( myCar );
  end;
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (31. Jul 2014 um 08:49 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von JamesTKirk
JamesTKirk

Registriert seit: 9. Sep 2004
Ort: München
604 Beiträge
 
FreePascal / Lazarus
 
#14

AW: und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)

  Alt 31. Jul 2014, 07:39
Die C++ Speicherverwaltung lässt sich am besten mit Delphi's object Typ vergleichen:

Delphi-Quellcode:
type
  CKlasse = object
    function anzahl: LongInt;
  end;
  PCKlasse = ^CKlasse;

function CKlasse.anzahl: LongInt;
begin
  anzahl := 42;
end;

var
  aktuelleanzahl: LongInt;
  Klassenvariable: PCKlasse;
begin
  aktuelleanzahl := 0;

  Klassenvariable := Nil;

  (* es gibt noch ne spezielle New() Syntax um Konstruktoren mit
  * Parametern aufzurufen, die müsste ich aber erstmal noch
  * nachschauen... :/
   *)

  New(Klassenvariable);

  (* hier wundere ich mich gerade, dass dein C++ Compiler sich nicht
  * darüber beschwert, dass es Klassenvariable->anzahl() heißen
  * muss... :/
   *)

  aktuelleanzahl := Klassenvariable^.anzahl;

  Dispose(Klassenvariable);
end.
In C++ kann man auch eine Klasse ohne den ganzen Zeiger / referenzen kram erstellen. Wie würde das in Delphi aussehen?
Wie schon von Mikkey geschrieben, gibt es dafür in Delphi und C# kein Pendant, da dort Objekte (Instanzen von Klassen) immer nur eine Referenz auf einen Speicherbereich sind und man dadurch den Vorteil hat, es nicht explizit dereferenzieren zu müssen (Der Nachteil ist, man muss die Objekte immer selber erstellen / Speicher anfordern (create) und bei Delphi unter Windows auch wieder freigeben).

Am Ehesten kannst due es mir Records in Delphi vergleichen.
Im Gegensatz zu C# hat Delphi dafür ein Pendant: object

Delphi-Quellcode:
procedure Test3;
var
  myCar : PAuto;
begin
  myCar := New( PAuto );
  try
    myCar^ := TAuto.Create( 'BMW' );
    Writeln( SizeOf( myCar ) ); // -> 4
  finally
    FreeMem( myCar );
  end;
end;
Mix doch bitte nicht New und FreeMem ! Das Äquivalent zu New ist Dispose und das zu FreeMem ist GetMem und es gibt einen wichtigen Unterschied zwischen den beiden Paaren: erstes kümmert sich um die Initialisierung/Finalisierung von Managed Typen (Strings (AnsiString, UnicodeString), Interfaces, Dynamische Arrays), aber das zweite Paar macht das nicht. Wenn du also ein record mit einem String (kein ShortString ) mit Hilfe von FreeMem freigibst, dann hast du ein Memoryleak, weil der Referenzzähler des Strings nicht runtergezählt wird.

Gruß,
Sven
Sven
[Free Pascal Compiler Entwickler]
this post is printed on 100% recycled electrons
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#15

AW: und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)

  Alt 31. Jul 2014, 08:51
Mix doch bitte nicht New und FreeMem !
Musst mich ja nicht gleich so anschreien - hast ja recht, und ich habe es in meinem Code auch geändert, merci
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Mikkey

Registriert seit: 5. Aug 2013
265 Beiträge
 
#16

AW: und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)

  Alt 31. Jul 2014, 09:39
Code:
  (* hier wundere ich mich gerade, dass dein C++ Compiler sich nicht
   * darüber beschwert, dass es Klassenvariable->anzahl() heißen
   * muss... :/
   *)
Es mag C++-Compiler geben, die (ähnlich wie Delphi beim '@' in Methodenparametern) das Sternchen generös einfügen.

Im Gegensatz zu C# hat Delphi dafür ein Pendant: object
Und (abgesehen davon, dass 'object' als veraltet gekennzeichnet wird) wie stellst Du dann echte Referenzvariablen dar:

Code:
{
  CKlasse obj(..);
  CKlasse* ptrObj = new CKlasse(..);
  CKlasse& refObj = *ptrObj;
}
?
  Mit Zitat antworten Zitat
Bladefire

Registriert seit: 30. Jun 2014
67 Beiträge
 
#17

AW: und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)

  Alt 31. Jul 2014, 10:44
Danke für eure zahlreichen antworten.

@ Sir Rufus: Ich verstehe nicht was records damit zu tun haben, ich dachte das wäre sowas wie struct(c++) nur für delphi.
Delphi-Quellcode:
procedure Test2;
var
  myCar : TAuto;
begin
  myCar := TAuto.Create( 'BMW' );
  Writeln( SizeOf( myCar ) ); // -> 100
end;
Wären die 100 Bytes nicht dank der automatischen derefernzierung trotzdem im heap gespeichert und im stack wird (vom compiler automatisch) ein zeiger darauf hinterlegt? (möglicherweise habe ich es doch falsch verstanden).

Sollte meine oben gennante aussage stimmen, wären dann nicht in delphi selbsterstellte zeiger ziemlich überflüssig?

lg Simon
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#18

AW: und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)

  Alt 31. Jul 2014, 12:34
Du versuchst hier Birnen mit Äpfel zu vergleichen.

C++ arbeitet anders als Delphi und daher muss man eben diese Besonderheiten berücksichtigen und kann da nicht stumpf 1:1 den Code umsetzen.

Ein Mazda RX-7 und ein Nissan 370ZX zu vergleichen geht schon (starten, fahren, tanken, ...), aber wenn man dann die Motoren auseinandernimmt ist und vergleichen will, hat man ein Problem, denn es sind 2 grundverschiedene Konzepte (Wankel <-> Otto) und trotzdem können beide fahren.

Somit wollte ich nur sagen, dass man das, was du da als C++ Beispiel hattest, in Delphi am ehesten mit Records vergleichen kannst, es ist aber nicht exakt dasselbe.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Bladefire

Registriert seit: 30. Jun 2014
67 Beiträge
 
#19

AW: und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)

  Alt 31. Jul 2014, 13:13
Herzlichen danke,

könntest du mir (oder jemand anderes) auch noch diese frage beantworten:


Delphi-Quellcode:
procedure Test2;
var
  myCar : TAuto;
begin
  myCar := TAuto.Create( 'BMW' );
  Writeln( SizeOf( myCar ) ); // -> 100
end;
Werden die 100 Bytes dank der automatischen derefernzierung im heap gespeichert und im stack wird (vom compiler automatisch) ein zeiger darauf hinterlegt? (möglicherweise habe ich es falsch verstanden).

lg simon

Geändert von Bladefire (31. Jul 2014 um 13:16 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
755 Beiträge
 
#20

AW: und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)

  Alt 31. Jul 2014, 15:05
Im Gegensatz zu C# hat Delphi dafür ein Pendant: object
... (abgesehen davon, dass 'object' als veraltet gekennzeichnet wird ...)
Wollte ich auch gerade schreiben.

Delphi-Quellcode:
procedure Test2;
var
  myCar : TAuto;
begin
  myCar := TAuto.Create( 'BMW' );
  Writeln( SizeOf( myCar ) ); // -> 100
end;
Werden die 100 Bytes dank der automatischen derefernzierung im heap gespeichert und im stack wird (vom compiler automatisch) ein zeiger darauf hinterlegt? (möglicherweise habe ich es falsch verstanden).
Wenn TAuto eine Klasse wäre, hättest du Recht; SirRufo schrieb aber TAuto = record und da gibt es keine automatische Dereferenzierung (Verhält sich ähnlich zu Klassen in C++).
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 04:29 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