On Fri, 20 Jun 2008 14:28:02 +0100, Luis Oliveira said:
"Hans Hübner" hans@huebner.org writes:
On Fri, Jun 20, 2008 at 9:13 AM, Luís Oliveira luismbo@gmail.com wrote:
I believe we were worried about big strings and the possibility of overflowing the stack. I suppose we could add an argument to WITH-FOREIGN-STRING and :STRING to force stack allocation.
Is this really a realistic issue with modern systems? Some sampling:
[...]
So, at least ~10 MB for the 32 bit FreeBSD machine, at least ~1 GB for the amd64 Linux box.
Many Lisps seem to operate with much smaller stacks. Here's the test I used:
(defconstant +size+ (* 50 (expt 2 10))) ; 50 KB
(defun test () (labels ((ek (n) (cffi:with-foreign-pointer (p #.+size+) (loop for i below +size+ do (setf (cffi:mem-ref p :char i) 0)) (format t "[~A] ~A: total allocated ~:D~%" n p (* +size+ n)) (ek (1+ n))))) (ek 1)))
(compile 'test)
SBCL: ~2 MB followed by "the party is over." CCL: ~2 MB followed by a segfault. CLISP: 8 MB followed by a graceful stack overflow. Allegro: ~4 MB followed by a graceful stack overflow. (used 40 KB chunks otherwise Allegro refused to do stack allocation)
This is on linux/amd64 (but I think my copy of Allegro is a 32-bit version). Hopefully my test is not (too) bogus.
There is an interaction with threads that Hans's C test code did not trigger. You can't expect to get 1 GB per stack for every thread!