Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Pilzschaf

Frischling

  • »Pilzschaf« ist der Autor dieses Themas

Beiträge: 43

Wohnort: Freiburg

  • Private Nachricht senden

1

17.05.2013, 23:03

Stackoverflow bei Arrays in C++

Guten Tag Forum.
Bei dem erstellen von sehr sehr großen Arrays kommt es bei mir gerne zum Stackoverflow error. Ich wollte fragen, ob ich diesen irgendwie umgehen kann (auf relativ einfache Weise) wenn nicht, ist es möglich, mir eine eigene Funktion zu schreiben, die Speicher reserviert... oder bekomme ich dann genau den gleichen error bei einer sehr großen Speicherreservierung?

Zitat

"Der Code ist schon schlecht."
"Ist doch Geschmackssache."
"Naja, es sind GOTOs drin."
"Oh."

2

17.05.2013, 23:22

Stichwort vector
Only God can judge me.

Tobiking

1x Rätselkönig

  • Private Nachricht senden

3

17.05.2013, 23:23

Es kommt ein wenig darauf an, wie du "sehr groß" definierst. Der Stack ist unter Windows per Default nur 1 MB groß. Brauchst du mehr Platz, musst du das Array auf dem Heap erzeugen. Also einfach per new. Das sollte für einige MB problemlos reichen. Irgendwann stößt du dabei (zumindest bei 32 Bit) auf das Problem, dass ein zusammenhängender Adressbereich gefunden werden muss. Dann könnte man die Speicherallokationen splitten, aber ich vermute so weit reicht dein Problem nicht.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

17.05.2013, 23:29

Zusammenhängender Adressbereich ist eigentlich kein Problem dank virtueller Speicherverwaltung. Adressen sind ohnehin alle virtuell und Speicher zusammengestückelt. Darum kümmert sich Windows dann schon.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Tobiking

1x Rätselkönig

  • Private Nachricht senden

5

17.05.2013, 23:42

Zusammenhängender Adressbereich ist eigentlich kein Problem dank virtueller Speicherverwaltung. Adressen sind ohnehin alle virtuell und Speicher zusammengestückelt. Darum kümmert sich Windows dann schon.

Virtuelle Speicherverwaltung sorgt nur dafür, dass der Speicher nicht zusammenhängend sein muss. Der Adressbereich muss weiterhin zusammenhängend sein. Und auch der virtuelle Adressraum ist mit reservierten Bereichen durchzogen und von Fragmentierung betroffen. Die Chance 1000 mal 1 MB zu bekommen ist da generell größer als 1 mal 1000 MB.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

17.05.2013, 23:47

Rein prinzipiell kann man natürlich auch einfach von vornherein einen größeren Stack für sein Programm anfordern. Aber ich vermute mal, dass std::vector die bessere Lösung sein wird. Ohne zu wissen, worum es sich konkret handelt, kann man am Ende aber natürlich nur spekulieren...

Zusammenhängender Adressbereich ist eigentlich kein Problem dank virtueller Speicherverwaltung. Adressen sind ohnehin alle virtuell und Speicher zusammengestückelt. Darum kümmert sich Windows dann schon.

Virtuelle Speicherverwaltung sorgt nur dafür, dass der Speicher nicht zusammenhängend sein muss. Der Adressbereich muss weiterhin zusammenhängend sein. Und auch der virtuelle Adressraum ist mit reservierten Bereichen durchzogen und von Fragmentierung betroffen. Die Chance 1000 mal 1 MB zu bekommen ist da generell größer als 1 mal 1000 MB.

Du spielst wohl auf externe Fragmentierung an? Damit hatte ich persönlich erst ein einziges Mal wirklich Probleme und das war in einer 32 Bit .NET Anwendung, die mit Arrays in der Größenordnung von hunderten MB hantiert hat und das war damals wohl mindestens zur Hälfte der Garbage Collection zu verdanken... ;)

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (17.05.2013, 23:54)


Tobiking

1x Rätselkönig

  • Private Nachricht senden

7

17.05.2013, 23:57


Du spielst wohl auf externe Fragmentierung an? Damit hatte ich persönlich erst ein einziges Mal wirklich Probleme und das war in einer 32 Bit .NET Anwendung die mit Arrays in der Größenordnung von GB hantiert hat und war wohl zur Hälfte der Garbage Collection zu verdanken... ;)

Genau. Es macht sich wenn dann eh erst dann bemerkbar, wenn das Programm schon viel Speicher reserviert und wieder freigegeben hat. Aber zu verachten ist es nicht, besonders wenn man wirklich große Speicherbereiche haben möchte. Deswegen zumindest die Erwähnung. Im CPP Forum gabs da auch mal einen Thread zu, ich finde den aber gerade auf Anhieb nicht.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

18.05.2013, 06:36

Hmm, ja gut, wenn der virtuelle Adressraum schon zerhackstückt ist, ist das natürlich ein Problem. Ich ging vom physischen Adressraum aus und dass er solche Arrays irgendwo in einer Initialisierung anlegt, wo dann der virtuelle Adressraum natürlich noch sehr jungfräulich ist.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

9

18.05.2013, 08:58

Wenn der Threadersteller mit seinen Arrays auf dem Stack überhaupt eine Chance hat, dass sein Programm durchläuft, wird Adressraumfragmentierung wahrscheinlich eher nicht sein Problem werden - so riesig scheinen die Arrays ja auch nicht zu sein.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

Werbeanzeige