Thema: Delphi TObjectlist.add(record)?

Einzelnen Beitrag anzeigen

Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.295 Beiträge
 
Delphi 12 Athens
 
#11

Re: TObjectlist.add(record)?

  Alt 7. Mär 2006, 17:49
Zitat von sniper_w:
Kannst du das bitte mehr dazu sagen.

Mal sehen ob ich's erlären kann

Wir haben hier eine völlig sinnlose Function mit einer Lokalen variablen.

Delphi-Quellcode:
Function VoelligSinnloseBerechnung(x:integer):integer;
var
  i:integer;
begin
  i:=x*3;
  result:=i*5;
end;
Nun ist i eine lokale Variable, die nur für die Function benötigt wird. Während die Procedure durchläuft ist i auf einer bestimmten Stelle im Hauptspeicher zugreifbar. Das heist ein Bestimmter Speicherplatz im Hauptspeicher ist für i reserviert. Was passiert nun mit i nachdem die Procedure durchgelaufen ist?

[ ] 1: Die Variable behält ihren Speicherplatz. Somit würde die Sache mit dem Pointer/Zeiger, der von marabu vorgeschlagen wurde funktionieren.

[ ] 2: Der Speicherbereich wird freigegeben und eine andere Procedure könnte dort an diesem Speicherplatz die nächste Variable plazieren.


Stell dir vor diese Function wird im Laufe des Programms ca. 3 Millionen mal aufgerufen.

Mit der ersten Variante sähe das ganz schön schlimm aus. Denn für jeden Aufruf würde i einen neuen Speicherpaltz erhalten und auch behalten. Aber nur mit dieser Variante würde würde das Beispiel von Marabu funktionieren, denn der Zeiger der in die Liste aufgenommen wird, zeigt eben auf diesen immer gültigen Speicherbereich.

Korrekt ist aber die zweite Version. Mit dieser Version kannst du dann aber nicht mehr mit Zeigern auf die lokalte Variable i arbeiten. Denn nach Beenden der Procedure zeigt der Zeiger auf einen Speicherbereich, der vieleicht noch den Wert von i beinhaltet aber ggf. auch schon wieder für andere Zwecke verwendet wird.


Edit:
Tja. Da war Marabu wohl schneller. (Und hat es auch eleganter erklärt)

@Marabu: Wollte dich nicht kränken
  Mit Zitat antworten Zitat