Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013) (https://www.delphipraxis.net/181230-und-c-speicherreservierung-von-instanzen-obijekten-ms-visual-studio-2013-a.html)

Mikkey 31. Jul 2014 14:10

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

Zitat von Olli73 (Beitrag 1267164)
Wenn TAuto eine Klasse wäre, hättest du Recht,

Darauf wollte ich auch erst hinweisen, aber
wenn TAuto keine Klasse wäre, würde
Delphi-Quellcode:
myCar := TAuto.Create( 'BMW' );
nicht funktionieren :-D

Olli73 31. Jul 2014 14:19

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

Darauf wollte ich auch erst hinweisen, aber
wenn TAuto keine Klasse wäre, würde
Delphi-Quellcode:
myCar := TAuto.Create( 'BMW' );
nicht funktionieren :-D
Was sollte da nicht funktionieren?

Mikkey 31. Jul 2014 14:34

AW: und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)
 
In meinem Delphi hat ein Record keinen Konstruktor und auch keine Klassenfunktionen, die so tun könnten als ob.

JamesTKirk 1. Aug 2014 06:38

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

Zitat von Sir Rufo (Beitrag 1267097)
Zitat:

Zitat von JamesTKirk (Beitrag 1267095)
Mix doch bitte nicht
Delphi-Quellcode:
New
und
Delphi-Quellcode:
FreeMem
!

Musst mich ja nicht gleich so anschreien :D

Sorry. :oops: Dabei hab ich doch extra klein und mit Bitte geschrieben, damit's nicht so laut wirkt :mrgreen:
Zitat:

Zitat von Sir Rufo (Beitrag 1267097)
- hast ja recht, und ich habe es in meinem Code auch geändert, merci

Danke :)

Zitat:

Zitat von Mikkey (Beitrag 1267099)
Zitat:

Zitat von JamesTKirk (Beitrag 1267095)
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.

Und solche Automatismen führen dann dazu, dass Anfänger nicht verstehen, was genau nun vor sich geht... :?

Zitat:

Zitat von Mikkey (Beitrag 1267099)
Zitat:

Zitat von JamesTKirk (Beitrag 1267095)
Im Gegensatz zu C# hat Delphi dafür ein Pendant:
Delphi-Quellcode:
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;
}
?

Dass
Delphi-Quellcode:
object
in Delphi als veraltet gilt stört mich ehrlich gesagt überhaupt nicht. Ich bin FPC Entwickler und dort ist
Delphi-Quellcode:
object
nach wie vor first-class Citizen (und wird zum Beispiel im Compiler selbst noch hier und da verwendet).
Referenzvariablen lassen sich in der Tat nicht mit Delphi darstellen (außer als Parameter, wo du
Delphi-Quellcode:
var
und in FPC
Delphi-Quellcode:
constref
verwenden kannst). Andererseits sind Referenzvariablen nicht auf Klassen beschränkt und hier geht es ja um die Speicherverwaltung um Klassen und deren Äquivalenzen in Delphi. Und da ist nun mal
Delphi-Quellcode:
object
das was am nähesten rankommt...

Zitat:

Zitat von Bladefire (Beitrag 1267143)
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).

Da
Delphi-Quellcode:
TAuto
ein Record ist, liegt es auf dem Stack. Bei
Delphi-Quellcode:
TAuto.Create
wird (grob gesagt) auf einer temporären Variable vom Typ
Delphi-Quellcode:
TAuto
auf dem Stack gearbeitet, die an
Delphi-Quellcode:
Create
als versteckter Parameter übergeben wird und anschließend an
Delphi-Quellcode:
myCar
zugewiesen wird. Ein Record ist nur dann auf dem Heap, wenn du mit
Delphi-Quellcode:
New
oder
Delphi-Quellcode:
GetMem
und ner Zeigervariablen (
Delphi-Quellcode:
type PAuto = ^TAuto;
) arbeitest.

Zitat:

Zitat von Mikkey (Beitrag 1267178)
In meinem Delphi hat ein Record keinen Konstruktor und auch keine Klassenfunktionen, die so tun könnten als ob.

Ab Delphi 2006 (glaub ich) und Free Pascal 2.6.0 (für (Klassen)Methoden) bzw. 2.7.1 (für Konstruktoren) funktioniert das.

Gruß,
Sven


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:06 Uhr.
Seite 3 von 3     123   

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