AGB  ·  Datenschutz  ·  Impressum  







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

records oder klassen?

Ein Thema von JayZ · begonnen am 21. Mai 2016 · letzter Beitrag vom 9. Jun 2016
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#11

AW: records oder klassen?

  Alt 23. Mai 2016, 13:22
Und was hat der Unterschied zwischen Stack und Heap jetzt mit Records und Klassen zu tun?
(naja einen Berührungspunkt wird man bestimmt finden)

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
bra

Registriert seit: 20. Jan 2015
711 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#12

AW: records oder klassen?

  Alt 23. Mai 2016, 14:10
Und was hat der Unterschied zwischen Stack und Heap jetzt mit Records und Klassen zu tun?
Records werden auf dem Stack erstellt, Klassen auf dem Heap. Daher auch der Unterschied mit Erstellen/Freigeben.
  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: records oder klassen?

  Alt 23. Mai 2016, 14:30
Und was hat der Unterschied zwischen Stack und Heap jetzt mit Records und Klassen zu tun?
Records werden auf dem Stack erstellt, Klassen auf dem Heap. Daher auch der Unterschied mit Erstellen/Freigeben.
Ist es nicht eher genau anders herum?

Ein Record ist ein Bei Google suchenValue Type und eine Klasse ist ein Bei Google suchenReference Type. Aufgrund dessen erfolgt die Ablage auf dem Stack bzw. Heap.
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
bra

Registriert seit: 20. Jan 2015
711 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#14

AW: records oder klassen?

  Alt 23. Mai 2016, 14:40
Ein Record ist ein Bei Google suchenValue Type und eine Klasse ist ein Bei Google suchenReference Type. Aufgrund dessen erfolgt die Ablage auf dem Stack bzw. Heap.
http://docwiki.embarcadero.com/RADSt....28advanced.29

Records are value types, so they are copied on assignment, passed by value, and allocated on the stack unless they are declared globally or explicitly allocated using the New and Dispose function. Classes are reference types, so they are not copied on assignment, they are passed by reference, and they are allocated on the heap.

Records are constructed automatically, using a default no-argument constructor, but classes must be explicitly constructed. Because records have a default no-argument constructor, any user-defined record constructor must have one or more parameters.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#15

AW: records oder klassen?

  Alt 23. Mai 2016, 17:48
wenn ich so etwas habe:

Delphi-Quellcode:
procedure irgendwas;
var
  myrecord : myrecordtype;
begin
...
end;
dann ist es klar, das d.. auf dem Stack landet;

Bei
Delphi-Quellcode:
procedure irgendwas;
var
  pmyrecord : ^myrecordtype;
begin
  new(pmyrecord);
...
end;
Ist es der Heap der die Daten aufnimmt.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Rollo62
Online

Registriert seit: 15. Mär 2007
4.095 Beiträge
 
Delphi 12 Athens
 
#16

AW: records oder klassen?

  Alt 23. Mai 2016, 19:00
http://docwiki.embarcadero.com/RADSt...blaufsteuerung

http://docwiki.embarcadero.com/RADSt...r_%28Delphi%29

Zitat:
Mengen, Records und statische Arrays aus einem, zwei oder vier Byte werden als 8-Bit-, 16-Bit- und 32-Bit-Werte übergeben. Größere Mengentypen, Records und statische Arrays werden als 32-Bit-Zeiger auf den Wert übergeben. Eine Ausnahme von dieser Regel ist, dass bei den Konventionen cdecl, stdcall und safecall die Records immer direkt im Stack übergeben werden. Die Größe eines auf diese Weise übergebenen Records wird immer bis zur nächsten Double-Word-Grenze erweitert.
Und ich gehe davon aus das lokale Records eben im immer Stack erzeugt werden (müsste man mal Testen wenn man viel Zeit übrig hat).
Deshalb wäre das nur für kleine Größen sinnvoll um einen Stacküberlauf zu vermeiden.

Stacküberlauf: Stammt das icht aus DOS-Zeiten, sowas habe ich schon eeewig nicht mehr gehabt (Klopf auf Holz).

Aber Segmentgrenzen-Fehler 16MB habe ich schon mehrfach gehabt, auf iOS ...
Es könnte ja sein das diese alten, vergessenen Probleme auf den mobilen Plattformen ein zweites Zombie-Dasein führen.

Rollo
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.445 Beiträge
 
Delphi 11 Alexandria
 
#17

AW: records oder klassen?

  Alt 26. Mai 2016, 15:30
Ergänzung:
Klassen können abgeleitet werden.
Klassen können Interfaces implementieren
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.143 Beiträge
 
Delphi 10.3 Rio
 
#18

AW: records oder klassen?

  Alt 27. Mai 2016, 03:28
Bei
Delphi-Quellcode:
procedure irgendwas;
var
  pmyrecord : ^myrecordtype;
begin
  new(pmyrecord);
...
end;
Ist es der Heap der die Daten aufnimmt.
Nööö bzw. das sind den hier die Daten?

"Die Daten" ist hier ein Pointer...

und genau das hat jaenicke hiermit gemeint...

Der Hauptunterschied bleibt aber:
Bei Klassen arbeitet man mit Pointern, bei Records muss man diese explizit benutzen und den Speicher auch ggf. Selbst reservieren und freigeben.
Natürlich nicht der "eine" Record, der mit einer Variablen definiert ist...

"Früher" wurden halt Records genutzt um Daten zu Speichern... Also war der Record EIN Datensatz. Da man nur 64KB Datensegment hatte, konnte man nicht beliebig viele Daten in einen Array of Record halten, sondern musste den Speicher vom HEAP anfordern. (New/Getmen)

Daher der Hinweis auf: Selber reservieren und freigeben...

Eine Klasse ist eigentlich "fast" nix anderes nur das man hier direkt den Pointer auf den Speicher hat... (Und noch ein bisschen mehr)

Also ob ich

Delphi-Quellcode:
type
  TMyDaten = Record
               Bla : Integer;
               Foo : boolean;
             end;
var
  PMyDaten = ^MyDaten;
begin
  New(PMyDaten);
  try
    PMyDaten^.Bla := 42;
  finally
    Dispose(PMyDaten);
  end;
end;
oder

Delphi-Quellcode:
type
  TMyDaten = Class
    public
      Bla : Integer;
      Foo : boolean;
  end;

Var
  MyDaten : TMyDaten;
begin
  MyDaten := TMyDaten.Create;
  try
    MyDaten.Bla := 42;
  finally
    MyDaten.Free;
  end;
end;
Ist "fast" gleich...

Mavarik
  Mit Zitat antworten Zitat
JayZ

Registriert seit: 14. Mai 2016
34 Beiträge
 
#19

AW: records oder klassen?

  Alt 9. Jun 2016, 08:46
ich verstehe is immer noch nicht
wenn ich classen benutze ist ja klar das ich die erstellen (create) und löschen (free) muss wie sieht die speicherveerwaltung denn bei records aus? muss ich das auch freigen?
  Mit Zitat antworten Zitat
DrTight

Registriert seit: 17. Okt 2014
8 Beiträge
 
#20

AW: records oder klassen?

  Alt 9. Jun 2016, 09:23
Was aber auch geht ist

Code:
type
  TMyDaten = Record
    Bla : Integer;
    Foo : boolean;
  end;
var
  LMyDaten :TMyDaten;
begin
  LMyDaten = Default(TMyDaten); // Record wird Initialisiert (alle Felder auf 0)
  LMyDaten.Bla := 42;
end;
Bla = 42 und Foo wäre False
Der Record wird wie eine lokale Variable behandelt (inclusive Speicher reservieren in Recordgröße und ohne Initialisierung) die auf den Stack abgelegt wird.

Records sind nix anderes als strukturierte Variablen.
Das gute an Records ist, das man sich nicht um das Freigeben des Speichers kümmern muss (Es sei denn man verwendet New())
Auch das kopieren von Records geht einfach durch Zuweisung (Achtung: Bei Pointer ,Klassen, variablen Arrays und Methodenreferenzfeldern wird nur die Adresse kopiert nicht der Inhalt)
Sie eignen sich gut als Übergabe und Resultparameter für Functionen und Proceduren.

Geändert von DrTight ( 9. Jun 2016 um 09:26 Uhr)
  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 08:13 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