Speicherbedarf von Struckturen auf dem Stack

Für allgemeine Fragen zur Programmierung mit PureBasic.
Vi-P
Beiträge: 30
Registriert: 18.01.2013 18:56

Speicherbedarf von Struckturen auf dem Stack

Beitrag 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.
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Speicherbedarf von Struckturen auf dem Stack

Beitrag 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.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Vi-P
Beiträge: 30
Registriert: 18.01.2013 18:56

Re: Speicherbedarf von Struckturen auf dem Stack

Beitrag 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?
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Speicherbedarf von Struckturen auf dem Stack

Beitrag 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
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten