Wo befinden sich die Membervariablen wenn ich die Instanz mit new anlege?
-
Nein, die Frage ist garnicht so dumm. Immerhin hat er ja laut Syntax 900000 chars als Stackvariable definiert. Jetzt völlig unabhängig vom Instanzierungskontext.
Letztendlich ist aber natürlich bei einer Heap-Instanzierung der Klasse aber ein Anlegen der chars auf dem Stack undenkbar.
-
Artchi schrieb:
Immerhin hat er ja laut Syntax 900000 chars als Stackvariable definiert.
Was meinst Du mit Stackvariable? buf hat innerhalb der Klasse Test automatic storage. Solange wie ein Objekt vom Typ Test lebt, lebt auch buf. Das sagt aber nix darüber aus, wo das Ding denn auch nun angelegt wird.
-
Hmm prinzipiell sehe ich keinen Grund warum die Variable nicht auch auf dem Stack anlegbar sein sollte. Es sind keine voneinander pyhsikalisch getrennte Speicherbereiche, die eine feste Größe besitzen, viel mehr wird der zur Verfügung stehende Speicher zwischen Heap und Stack aufgeteilt. Sie sind hierbei so organisiert, dass der freie Speicher sowohl zum Wachsen des Heaps als auch zum Erweitern des Stacks nutzbar ist.
Was natürlich sein kann ist, dass der Heap durch Fragmentierung des Speichers sehr groß wird und der Stack nicht mehr wachsen kann, obwohl noch jede Menge Speicher im Heap zur Verfügung steht....
-
Achja, die Variablen eines Objekts werden dort angelegt wo das Objekt angelegt wird.
(Ausnahme bilden natürlich die Variablen, deren Inhalt mit new angelegt worden sind. Diese befinden sich immer im Heap.)
-
Zumindest unter Windows wird die maximale Stacksize durch die zur Compilezeit angegebenen Grenzen beschränkt. Für den Primary Thread ist das auf jeden Fall fix, für nachträglich erzeugte Threads kann man die auch nochmal zur Laufzeit ändern.
Das sind aber spezifische Sachen. Ohne es jetzt nachgeschlagen zu haben meine ich, dass der Standard dir aber sonst keine Garantien über Größenverhältnisse von Stack/Heap/Freispeicher gibt.
-
@7H3 N4C3R
Mach mich nicht schwach... im allgemeinen drüfte es extrem schwierig sein den für den Stack benötigten Speicher im Voraus festzulegen bzw. zu berechnen.
Und selbst wenn, wozu sollte das ganze gut sein außer die Entwickler und die Anwender zu ärgern?
Gibt gar keinen Grund den Stack auf einen festen Wert zu begrenzen, der in keinem Zusammenhang mit dem verfügbaren RAM steht.Die Compiler und Linker-Einstellungen dienen wohl eher dazu die Anfangsgröße festzulegen, die direkt beim Programmstart reserviert werden soll.

-
Mathias schrieb:
Die Compiler und Linker-Einstellungen dienen wohl eher dazu die Anfangsgröße festzulegen, die direkt beim Programmstart reserviert werden soll.

Ist nunmal so
Anfangs- & Max. Größe wird fix gesetzt. Gelesen in "Windows Multithreading" vom mitp Verlag.
Das dient bespielsweise dazu, dass eine außer Kontrolle geratene Rekursion nicht sämtliche Ressourcen deines Systems verbrezelt.
-
Mathias schrieb:
Gibt gar keinen Grund den Stack auf einen festen Wert zu begrenzen, der in keinem Zusammenhang mit dem verfügbaren RAM steht.
Dafür gibt es viele gute Gründe. Nicht zuletzt den, dass der stack ein zusammenhängendes Stück Speicher (im virtuellen Adressraum) sein muss. Und herumkopieren, wenn er vergrössert werden müsste, ist nicht.
-
Was mich wundert ist, woher weisst Du so genau, dass genau hier der Fehler auftritt und warum weisst Du, dass dies die Ursache ist.
Es kann durchaus sein, dass der Stack schon woanders ueber-/gefuellt wird und dieser kl. Aufruf nur "das Fass zum Ueberlaufen bringt.
Mein erster Verdacht sind bei solchen Fehlern immer amoklaufende Rekursionen.
-
Mathias schrieb:
Gibt gar keinen Grund den Stack auf einen festen Wert zu begrenzen, der in keinem Zusammenhang mit dem verfügbaren RAM steht.
Bei Multithreading gehts nicht anders. Ansonsten hast du IMHO technisch gesehen recht.
-
Artchi schrieb:
Nein, die Frage ist garnicht so dumm.
Nun, darüber lässt sich streiten.

Artchi schrieb:
Immerhin hat er ja laut Syntax 900000 chars als Stackvariable definiert.
Ach ja? Woran siehst du denn, dass es eine Stackvariable ist?
Artchi schrieb:
Jetzt völlig unabhängig vom Instanzierungskontext.
Das ist aber genau der springende Punkt. Alles was du siehst, ist eine leblose Hülle, die einen Speicherbereich von 9000000 char's beschreibt. Zu diesem Zeitpunkt hast du weder eine Variable, und erst recht keine Stackvariable. Erst bei der Erzeugung eines Objektes wird anhand der Art der Definition auch der Speichertyp festgelegt.
-
Das ist aber genau der springende Punkt. Alles was du siehst, ist eine leblose Hülle, die einen Speicherbereich von 9000000 char's beschreibt. Zu diesem Zeitpunkt hast du weder eine Variable, und erst recht keine Stackvariable. Erst bei der Erzeugung eines Objektes wird anhand der Art der Definition auch der Speichertyp festgelegt.
ich glaube, das weis er ;). Er wollte damit nur sagen, dass die syntax genauso wie bei einem array ist, welches immer auf dem stack liegt, und dass dieser Gedanke deshalb nicht so abwegig ist

-
otze schrieb:
ich glaube, das weis er ;).
Die Erklärung war ja auch eher für den Threadersteller gedacht.

-
groovemaster schrieb:
otze schrieb:
ich glaube, das weis er ;).
Die Erklärung war ja auch eher für den Threadersteller gedacht.

dan darfst du auf ein zitat nicht mit "du" antworten

-
Deshalb bleibt der Kontext trotzdem unbezogen.

-
