DIM innerhlab einer Procedure

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

DIM innerhlab einer Procedure

Beitrag von Kurzer »

Hallo,
wenn ich Dim <Array> innerhalb eier Procedure aufrufe, wird der dafür reservuerte Speicher nach dem Verlassen der Procedure automatisch wieder freigegeben? Oder allokiert PB bei jedem Aufruf ein weiteres mal Speicher?
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070
Useralter in 2025: 57 Jahre.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Wird beim verlassen wieder freigegeben.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: DIM innerhlab einer Procedure

Beitrag von Kiffi »

@Kurzer: Das hättest Du aber auch selber mit einem kleinen Testcode und
einen Blick auf die Speicherauslastung im Taskmanager herausfinden können ;-)

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Beitrag von Kurzer »

Danke. :allright:

@Kiffi hast Recht:
Ich hatte erwartet, daß Windows eh hier und da Speicher allokiert und wieder freigibt wenn ich anfange zu kompilieren, aber die Speicheranzeige ist dann doch recht stabil geblieben, so daß ich den Effekt mittels Testcode sehen kann.
Zu meiner Entlastung anbei der Testcode. ;-)

Code: Alles auswählen

Procedure Test()
Dim Array.l(30000)

Delay (5000)

EndProcedure
; Vorher den Systemmonitor (Speicheranzeige) starten!
Test()
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070
Useralter in 2025: 57 Jahre.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Richtig sieht man es ja hier :

Code: Alles auswählen


Procedure a()
  Dim b(10) 
  ProcedureReturn 0
EndProcedure



Macro MP0{
_Procedure0:
  PS0=12
  XOr    eax,eax
  PUSH   eax
  PUSH   eax                                                                                                                                                                                                                  
; Dim b(10) 
  PUSH   dword 5
  LEA    edx,dword [esp+4]
  PUSH   edx
  PUSH   dword 0
  MOV    edx,dword [esp+12]
  CALL   SYS_FreeArray
  MOV    eax,11
  PUSH   dword 4
  CALL   SYS_AllocateArray
; ProcedureReturn 0
  XOr    eax,eax
  JMP   _EndProcedure1
; EndProcedure
  XOr    eax,eax
_EndProcedure1:
  PUSH   eax
  MOV    edx,dword [esp+4]
  CALL   SYS_FreeArray
  POP    eax
  ADD    esp,8
  RET
}
Antworten