variablen und pointer



  • groovemaster schrieb:

    Sgt. Nukem schrieb:

    Wenn ich ein megafettes Konstrukt habe, in dem 18 Megabyte Daten drinstecken, dann wird dieser ganze Scheiß kopiert wenn ich den als Parameter einer Funktion übergebe. D.h. es ist lahm wie Sau und es kostet weitere 18 MB Speicher.

    Mal ganz abgesehen davon, dass dir dann dein Programm abkackt, weil du zB nur 1 MB an Stack zur Verfügung hat.

    War auch nur ein Beispiel. 💡



  • groovemaster schrieb:

    Mal ganz abgesehen davon, dass dir dann dein Programm abkackt, weil du zB nur 1 MB an Stack zur Verfügung hat.

    Stimmt so nicht. Vllt. unter Windows, Linux allokiert den Stack jedoch dynamisch und so weit ich weiss ist die obere Grenze dort weitaus ueber 1 mb. Fuer die ganz Mutigen gibt es daher auch noch alloca (3) unter Linux/BSD. Ausserdem ist das ganze auch ziemlich Compiler abhaengig.
    Ich denke aber, dass der Stack groesser als 1 mb sein muss. Stell dir doch mal vor, eine Anwendung mit polymorphem ASCII darstellbarem Code wuerde (je nach Groesse/Funktion) niemals in 1 mb passen (wobei man den rest des Ganzen auch noch bedenken muss).
    //edit: Ach btw, vllt. meine Sgt. Nukem Kernel Space Zeug mit 16mb stack 😉 Dort ist sowas definitv moeglich.



  • [0x[90]| schrieb:

    Stimmt so nicht. Vllt. unter Windows, Linux allokiert den Stack jedoch dynamisch und so weit ich weiss ist die obere Grenze dort weitaus ueber 1 mb.

    Du kannst unter Windows auch mehr als 1 MB an Stack zur Verfügung stellen. 1 MB ist jedoch afaik der Default Wert.
    Und dass der Stack unter Linux dynamisch ist, glaub ich dir irgendwie nicht. alloca (bzw _alloca) gibts auch unter Windows, und da kannst du auch nur maximal den Speicher reservieren, den das Programm beim Start zugewiesen bekommen hat.

    [0x[90]| schrieb:

    Stell dir doch mal vor, eine Anwendung mit polymorphem ASCII darstellbarem Code wuerde (je nach Groesse/Funktion) niemals in 1 mb passen (wobei man den rest des Ganzen auch noch bedenken muss).

    Hä, seit wann wird denn ein Programm in den Stack geladen. Ich kann nicht für Linux sprechen, unter Windows jedenfalls nicht.



  • Habs gerade mal ausprobiert. Bei 1MB ist Schluss auf dem Stack (Visual Studio 6).



  • Hatte ich doch noch richtig in Erinnerung. 🤡
    Afaik lässt sich diese Grösse mit dem Linkerflag '/STACK' beeinflussen. Muss ich bei Gelegenheit auch mal ausprobieren.



  • groovemaster, ich bin ziemlich sicher dass der Linux stack dynamisch ist. Google einmal ein wenig falls du naeheres wissen willst.
    Du kannst keine Programme im Stack ausfuehren, du kannst aber ausfuehrbaren shellcode mittels sub/and auf den Stack schieben. D.h. dass es moeglich ist Teile deines Codes im Stack auzufuehren, sofern der Hardwarecheck der jeweiligen Architektur nicht dazwischenpfuscht und das ganze vereitelt.



  • Ich bezweifle zwar ebenfalls, dass der Stack unter Linux dynamisch ist, aber darum geht es ja nicht. Esht um Dinge, die man mit Zeigern machen kann, mit "normalen" Variabeln hingegen aber nicht. Und was fällt einem da sofot ein? Richtig, rekursive Datenstrukturen, also Listen, Bäume, ...



  • danke für die vielen antworten,
    ich glaub ich hab es jetzt verstanden 😃



  • Cpp_Junky schrieb:

    Habs gerade mal ausprobiert. Bei 1MB ist Schluss auf dem Stack (Visual Studio 6).

    Wie hast du das getestet?

    Ich hab ne Klasse erstellt

    class test { int a[2*256]; };

    was den Objekten ne Größe von 2 MB verleiht! Hab sie dann als Wert an ne Funktion übergeben. Hat alles funktioniert. 😕 Nix abgestürzt.



  • Henrie Maske schrieb:

    Cpp_Junky schrieb:

    Habs gerade mal ausprobiert. Bei 1MB ist Schluss auf dem Stack (Visual Studio 6).

    Wie hast du das getestet?

    Ich hab ne Klasse erstellt

    class test { int a[2*256]; };

    was den Objekten ne Größe von 2 MB verleiht!

    Das sind 2KB und nicht 2MB 🙄


Anmelden zum Antworten