天天看點

函數棧的大小(Stack Overflow Problems)

Stack Overflow Problems

This file gives some hints on addressing this problem on different platforms. Under Unix-like systems, programs may throw a "Segmentation Fault"error.  This can be due to stack overflow, especially from recursive function calls or huge data sets.  In our demo program "Pi"(see "$(CORE_PATH)/progs/pi"), we compute Pi to any number of desiredbits or digits.  Here are some test results on when stack overflowswill occur on different platforms, using their default stack sizes.          

platform       default size   # bits  # digits       

===============================================================       

SunOS/Solaris  8192K bytes    <=39875 <=12003 (Shared Version)       

Linux         8192K bytes    <=62407 <=18786                            (linux預設8M)       

Windows   1024K bytes    <=10581 <=3185  (Release Version)     (windows預設1M)       

cygwin      2048K bytes    <=3630  <=1092  (cigwin預設2M)(自己檢視的結果為2043K)       

If we now change their stack size to their maximum, our Pi program can compute more bits.        

How to change the default stack size on different platforms:In general, under Unix-like platforms, the stack size is controlled by environment variable, not the program itself.  (linux下非編譯器決定棧大小,而是由作業系統環境決定)So you cannot pass any flags to the compilers, like gcc, to setup stack size.  Under Windows platforms, thestack size information is contained in the executable files.  It can be set during compilation in Visual C++, but this is not available in gcc. (windows下可以由編譯器決定棧大小)Alternatively, Microsoft provides a program "editbin.exe" which can change theexecutable files directly.  Here are more details:

stack使用量計算toolは以下です

SunOS/Solaris:

        > limit                 # shows the current stack size

        > unlimit               # changes the stack size to unlimited 

       > setenv STACKSIZE 32768 # limits the stack size to 32M bytes

Linux:

       > ulimit -a           # shows the current stack size (ulimit為系統指令,非編譯器指令)       

       > ulimit -s 32768      # sets the stack size to 32M bytes

Windows (during compilation):

        1. Select "Project->Setting".

        2. Select "Link" page.

        3. Select "Category" to "Output".

繼續閱讀