große lokale Variablen in Funktionen + globale Variablen = SEGMENTATION FAULT ?



  • moormaster schrieb:

    double arr[300][300][300];
    

    😮



  • Ich weiss selbst, dass das groß is 😃 Mich wundert es nur, dass der Compiler nix dazu sagt... der müsste doch als erster merken, dass das nich auf den Stack passt?

    Ich habe ein großes Programm, was mal jmd. geschrieben hat, welches derart große Arrays verwendet hat... Das lief auch so auf einem Cluster mit 64 Bit.

    Bei Wechsel der plattform auf "Normalrechner" machen diese großen Arrays nun Probleme und ich muss offenbar zusehen, dass der ganze Kram nun dynamisch alloziiert wird 😃



  • moormaster schrieb:

    Ich habe ein großes Programm, was mal jmd. geschrieben hat, welches derart große Arrays verwendet hat...

    Ich frag jetzt nicht, wie man auf solche Ideen kommt...



  • Auf diese Idee kommt man wohl, wenn man nur programmiert, um ein Problem zu lösen und sich nicht mit dynamischer Speicherreservierung herumplagen möchte... es war nicht meine Idee die Arrays so anzulegen 😃 Ich habe nur versucht mich darumzudrücken, das alles auch noch ändern zu müssen 😃



  • Der Compiler sagt nix dazu weil er üblicherweise die grösse des Stacks nicht kennt. Die Stackgrösse kannst du oft beim Linken angeben. Beim MSVC z.B. (genauer Visual Studio) gibt's dazu ein hübsches Feld in den Linker-Einstellungen, da kannst du ja mal "524288000" (500MB) reinschreiben wenn du willst (falls du Visual Studio verwendest).
    Wenn das Programm nur einen einzigen Thread verwendet sollte das sogar auf normalen 32 Bit Windows Systemen laufen.



  • Danke, ich werd mal die manpages vom g++ durchschauen, welcher Parameter dafür zuständig ist 😃



  • Das hat nicht einmal was mit dem Programm an sich zu tun. Unter Linux zB einfach mit ulimit -s <LIMIT> die gewünschte Stackgröße setzen.



  • Fellhuhn schrieb:

    Das hat nicht einmal was mit dem Programm an sich zu tun. Unter Linux zB einfach mit ulimit -s <LIMIT> die gewünschte Stackgröße setzen.

    Danke! Das hat definitiv gepasst 😃 Die alte Grenze des Stacks stand auf 8 MB, was in etwa zu meinen Beobachtungen passt. Stell ich das auf > ~205Mb dann läuft obiges Programm ohne Fehler durch.

    Können mir durch eine zu eine hohe Stack-Grenze irgendwelche Nachteile entstehen? Bleibt dann generell weniger Platz für dynamisch alloziierten Speicher oder erst, wenn der Stack tatsächlich so groß wird?



  • Abgesehen davon das es "schlechter Stil" ist, weil man normalerweise nicht von jedem erwarten kann das er manuell seinen Stack einstellt, ist der einzige Nachteil das der dynamische Speicherbereich der dem Prozess zur Verfügung gestellt wird entsprechend kleiner wird. Also im Grunde hast du die gleiche Menge an Speicher, nur eben weniger Heap, dafür mehr Stack.



  • Ok 🙂


Anmelden zum Antworten