Seite 1 von 1

Speicherbedarf von Struckturen auf dem Stack

Verfasst: 06.01.2020 21:45
von Vi-P
Habe zwar eine Meinung hierzu, aber evtl. hat der Compiler eine andere ... . Hat sich jemand schon mal damit beschäftigt?

Nehmen wir mal an eine Struktur enthält Variablen (wie .i, .d etc.), Strings, Arrays von Variablen, Arrays von Listen, Maps oder Strukturen, Listen, Maps und Strukturen. Strukturen können wiederum das selbe enthalten.
Was belastet bei einer lokalen Variable den Stack und was "nur" den Betriebssystemspeicher.

Meine Vermutung, die Euch nicht beeinflussen soll:
Stack: Jedes Element der Struktur mit seiner Größe wobei String, Liste oder Map die Größe eines Pointer haben.
Der Rest geht ans Betriebssystem.
Anders formuliert, alles statische auf den Stack, von allem dynamischen nur jeweils ein Pointer.

Danke schon mal für alle zielführenden Beiträge.

Re: Speicherbedarf von Struckturen auf dem Stack

Verfasst: 06.01.2020 22:21
von mk-soft
Es liegt nicht alles auf dem Stack...

Nur Variablen und Strukturen die in einer Prozedur mit Protected angelegt werden liegen auf dem Stack. Diese werden automatisch beim verlassen der Prozedur wieder freigegeben.

Die mit Global, Static, Define angelegen Variablen und Strukturen werden in lese- und schreibbare 'section data' abgelegt.

Die mit Threaded angelegten Variablen und Strukturen werden zur Laufzeit Speicher angefordert.

Arrays, Listen, Map werden zur Laufzeit Speicher angefordert. Auch wenn diese als Protected in Prozeduren angelegt werden.

Re: Speicherbedarf von Struckturen auf dem Stack

Verfasst: 06.01.2020 22:55
von Vi-P
@mk-soft: Global und Static ist klar. Bist du Dir mit Define innerhalb einer Procedur wirklich sicher? Wenn ich die Procedur rekursiv verwende, kann die Variable in jeder Rekursionstiefe einen anderen Wert haben, weil sie nicht static ist.
"zur Laufzeit Speicher angefordert" heißt "nicht auf dem Stack"?
Wenn mit Protected eine Struktur erstellt wird, wie sieht es mit den enthaltenen Arrays/Listen/Maps aus?

Re: Speicherbedarf von Struckturen auf dem Stack

Verfasst: 07.01.2020 00:25
von mk-soft
Nach ASM-Output mal grob...

Code: Alles auswählen

Structure udtFoo
  iVal.i
  Map MyMap.i()
EndStructure

Procedure foo()
  Protected MyData.udtFoo ; <- Init Dynamic Structure - Values and Pointer to Map on Stack
  Define iVal = 200 ; <- Same us Proteced on Stack
  
  MyData\MyMap("1") = 100
  
  ProcedureReturn MyData\MyMap()
  ; Exit <- Free Structures and String
  
EndProcedure

r1 = foo()

Debug r1
Debug iVal