004
23.06.2007, 14:52 Uhr
0xdeadbeef
Gott (Operator)
|
Naja, das Alloziieren auf dem Stack ist nun nicht besonders aufwändig, wenn man nicht gerade eine Debug-Version ausliefert, die stack guards und vergleichbaren Kram einbaut - der Kernel muss halt ein paar Pages anfordern, und das Programm einen Zeiger setzen.
Prinzipiell ist die Größe des Stacks lediglich beschränkt durch den virtuellen Adressraum - auf 32bit-Maschinen also 2GB, suf 64bit-Maschinen, wenn ich mich da grad nicht verrechne, 8 Exabyte - allerdings muss natürlich schon genug physischer Speicher dafür vorhanden sein. Der Stack wächst halt einfach nach unten.
Etwas komplexer wird es, wenn man multithreadet - weil man dann im Stack-Adressraum mehrere Threadstacks unterbringen muss. Ich weiß, dass Java per Default Threadstacks von 1MB Größe anlegt und die untereinander wegschichtet, das heißt, wenn du da über den einen Stack hinausschreibst, landest du irgendwann im anderen. Das hat mir schonmal ziemliches Kopfzerbrechen im Zusammenhang mit einer C-Bibliothek und dem JNI verursacht . Wie Windows das macht, müsste ich jetzt nachkucken. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra Dieser Post wurde am 23.06.2007 um 14:53 Uhr von 0xdeadbeef editiert. |