Hey,
wahrscheinlich habe ich ein Brett vor dem Kopf, aber alle Internetsuchversuche haben nichts gebracht. Ich will eigentlich nur wissen, wo PureBasic eine Liste ablegt. Auf dem Stack oder auf dem Heap. Eigentlich betrifft die Frage auch Maps bzw. die Speicherverwaltung allgemein.
Hintergrund der Frage ist, ob man relativ unbesorgt Listen mit großen Mengen Datensätzen/Strukturen anlegen und verarbeiten kann. Aus anderen Programmiersprachen kenne ich das so, dass viele Variablen standardmäßig auf dem Stack abgelegt werden und dieser eher begrenzt ist.
Ich hoffe, die Frage ist nicht zu blöd . Falls das Thema schon hundertmal behandelt wurde, wäre ich für einen Link auf das Thema dankbar. Ich habe echt nix Konkretes dazu gefunden...
LG
Qnode (seit heute glücklicher Besitzer der PureBasic-Vollversion)
[gelöst] Wo wird eine Liste abgelegt
- Qnode
- Beiträge: 67
- Registriert: 19.07.2018 20:41
- Computerausstattung: i5, 16GB RAM, Win10, PureBasic 6.00 (Windows - x64)
[gelöst] Wo wird eine Liste abgelegt
Zuletzt geändert von Qnode am 03.08.2018 13:30, insgesamt 1-mal geändert.
Re: Wo wird eine Liste abgelegt
Wenn du nicht gerade in einen Bereich von mehreren hundert Millionen Listeinträgen kommst, würde ich mir keine Gedanken darüber machen.Help über Lists hat geschrieben:Sie können so viele Elemente hinzufügen wie Sie wollen (bzw. so viele, wie in den Speicher Ihres Computers passen)
So weit ich weiß, werden Variablen nur im Stack abgelegt, wenn eine Prozedur aufgerufen wird. Das spielt aber dann auch nur eine Rolle, wenn die Prozedur immer wieder rekursiv aufgerufen wird. (Hoffe damit jetzt nicht zu viel Blödsinn geschrieben zu haben )
Re: Wo wird eine Liste abgelegt
Die Liste selbst wird wohl auf dem Stack liegen wenn es eine lokale variable ist, weiß ich aber nicht. Wenn du aber eine Liste in einer Structure hast (die mit AllocateStructure() oder InitializeStructure() verwendet wird), dann liegt die vermutlich im Heap. In jeden Fall werden die Elemente selbst vermutlich auf dem Heap liegen! Und Listen haben auch ein eigenes Memory Management, so dass nicht jedes AddElement() einzeln alloziiert.
- NicTheQuick
- Ein Admin
- Beiträge: 8675
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
- Kontaktdaten:
Re: Wo wird eine Liste abgelegt
Alle dynamischen Daten wie Maps, LinkedLists und Arrays, die du mit Dim erstellst, werden natürlich auf dem Heap angelegt. Auch alles, was du mit AllocateMemory oder AllocateStructure anforderst, wird im Heap erstellt. Und dynamische Strings auch. Nur fixe Strings liegen auf dem Stack.
Auf den Stack gehören nur statische Variablen mit zur Übersetzungszeit bekannten Größen.
Auf den Stack gehören nur statische Variablen mit zur Übersetzungszeit bekannten Größen.
Code: Alles auswählen
; Auf dem Stack (relativ kleiner Pointerwert)
Define stack.i
Define stackString.s{5} = "Hallo"
Debug @stack
Debug @stackString
NewList l()
; Dieses Element wird auf dem Heap angelegt (viel größerer Pointerwert)
AddElement(l())
Debug @l()
; Dieser Speicherbereich ist auch auf dem Heap
Define *mem = AllocateMemory(100)
Debug *mem
Define heapString.s = "Hallo Welt"
Debug @heapString
- Qnode
- Beiträge: 67
- Registriert: 19.07.2018 20:41
- Computerausstattung: i5, 16GB RAM, Win10, PureBasic 6.00 (Windows - x64)
Re: Wo wird eine Liste abgelegt
Vielen Dank. Damit ist meine Frage beantwortet.