Wieviel Speicher vom Stack



  • Hallo Leute,

    wieviel Speicher kann ich eigentlich vom Stack anfordern? Bzw folgendes:

    void foo(unsigned long long  dummy;){
    char buffer[dummy];
    //usw usw
    }
    

    Wie weit geht das? Mit unsigned long long kann ich ja ziemlich große Zahlen darstellen....



  • Die Größe vom Stack legst du mit Compiler- bzw. Linkeroptionen fest.

    Die haben irgendwelche Defaulteinstellungen.
    Welche, sagt dir dein Manual.



  • Oh.. Ok, da muss ich gleich mal nachsehe.
    Seit ich von unsigned int auf unsigned long long geändert habe, stürzt die Sache immer ab 😮



  • beginner_offl schrieb:

    Seit ich von unsigned int auf unsigned long long geändert habe, stürzt die Sache immer ab 😮

    Wieviel Speicher hast du denn im Rechner?
    Und wieviel Bit (32/64) hat dein Betriebssystem?*

    *Wieviel Speicher unterstützt dein Betriebssystem?



  • Speicher im Rechner ... RAM? 2GB 32 Bit OS



  • Welche Wert gibst du denn für dummy an?

    Ist bei einem 32-Bit-System ein unsigned long long für Speicherangaben überhaupt sinnvoll?



  • Nö,unsigned long long war eher ein work-around.
    Ich lese Dateien Byte für Byte ein, bearbeite dann und speichere wieder.
    Das ganze funktioniert bei Dateein bis ca. 4MB Größe, dann ist Schluß.
    Dachte ich versuchs mal mit long long, bringt aber nicht wirklich was, im gegenteil.



  • Das Problem ist nicht der Datentyp, sondern dass du VLA verwendest.
    Verwende besser malloc mit free, bzw. RAII konformes aber nicht standardkonformes alloca, wenn dein Compiler das anbietet.



  • Das Problem ist nicht der Datentyp, sondern dass du VLA verwendest.

    schon wieder..... Kann es sein, dass VLA nicht ganz ausgereift sind?
    Werde den Code am Montag ändern...



  • VLA sind ausgereift.
    Aber genau wie C ist deren Gebrauch nur was für Profis, also Leute, die wissen, was sie tun und erwarten können, und eben nicht davon ausgehen, dass alles, was sich compilieren lässt auch zur Laufzeit funktioniert.
    Da du Anfänger bist, lass also die Finger von VLA, genauso wie deine Lehrer, Tutorialschreiberlinge, Fachbuchautoren...



  • Ja , bin Anfänger, da hast du Recht.
    Trotzdem: Was muss ich bei VLA ´s beachten? Ich mein zu wissen das es sie gibt, dann aber nicht hernehmen ist ja auch bescheuert



  • BTW: Ich habe extra ein VLA benutzt, da mir malloc usw. zu unsicher war, bzw. ich mir dachte VLA wäre der SICHERERE Weg...



  • beginner_offl schrieb:

    Trotzdem: Was muss ich bei VLA ´s beachten? Ich mein zu wissen das es sie gibt, dann aber nicht hernehmen ist ja auch bescheuert

    In erster Linie gilt es zu beachten, dass die Größe des VL-Arrays nicht über ein gewisses Maß hinaus gehen sollte. Insbesondere sollte sie nicht vollständig von externen Eingaben abhängen.

    Der Stack für Userprogramme liegt gängigerweise im niedrigen Megabyte-Bereich. Eine sichere Nutzung von VLAs könnte etwa so aussehen, dass man bei kleinem Speicherbedarf das VL-Array benutzt und ab einer gewissen Größe auf malloc umstellt. So hat man die Geschwindigkeitsvorteile der Stackallokation bei gängiger Anwendung ohne dabei feste Oberschranken für die Datenmenge festlegen zu müssen und insbesondere umgeht man das Risiko des Stacküberlaufs.

    int
    f(size_t n)
    {
            uchar *p;
            int usemalloc;
            uchar buf[n>MAX? usemalloc=1: n];
    
            if(usemalloc){
                    p = malloc(n);
                    if(!p)
                            return -ENOMEM;
            }else
                    p = buf;
    
            /* use p */
    
            if(usemalloc)
                    free(p);
    
            return 0;
    }
    


  • Wutz schrieb:

    Das Problem ist nicht der Datentyp, sondern dass du VLA verwendest.
    Verwende besser malloc mit free, bzw. RAII konformes aber nicht standardkonformes alloca, wenn dein Compiler das anbietet.

    Wieso sollte man alloca den VLAs vorziehen? Wenn du dir die Implementierung in gängigen Compilern ansiehst, ist alloca nichts anderes als ein VLA mit Funktionsscope, anstatt Blockscope. Wieso das besser sein sollte, entgeht mir. Eine Fehlerbehandlung gibt es hier genauso wenig wie bei VLAs, es wird einfach ein Registerwert vom Stackpointer subtrahiert (bei gängigen Architekturen). Ob es danach knallt, darum kümmert sich alloca ebenso wenig wie VLAs.



  • Du "forderst" nichts vom Stack an sondern belegst es einfach und wenn der (StackStart - Stackpointer) > StackSize dann hast du einen Stackoverflow, weil du dann auch irgend einen Code überschreiben würdest. Der Linker in Visual Studio legt die Stack größe auf 1 MB und du kannst dies unter Linker->System ändern. Wenn du aber so große Daten verarbeitest, solltest du das auch nicht auf den Stack legen sondern eben entweder mit new oder malloc auf den Heap.


Log in to reply