Sun Studio 12:Fortran 用户指南

3.4.96 –stackvar

尽可能在栈上分配局部变量。

此选项使编写递归代码和可重入代码更容易,并在并行化循环时为优化器提供更多自由。

建议将 -stackvar 与任何并行化选项一起使用。

局部变量是除哑元、COMMON 变量、从外部作用域继承的变量或可通过 USE 语句访问的模块变量之外的变量。

-stackvar 有效的情况下,局部变量是在栈上分配的,除非它们具有属性 SAVESTATIC。请注意,显式初始化的变量是使用 SAVE 属性隐式声明的。缺省情况下,未显式初始化但其某些组件已初始化的结构变量,没有使用 SAVE 隐式声明。此外,与具有 SAVESTATIC 属性的变量等效的变量,也隐式具有 SAVESTATIC

以静态方式分配的变量隐式初始化为零,除非程序为其显式指定了初始值。在栈上分配的变量并未隐式初始化(缺省情况下可进行初始化的结构变量的组件除外)。

使用 -stackvar 将大数组放在栈上可以使栈溢出,从而导致段故障。此时可能需要增加栈大小。

执行程序的初始线程有一个栈,而多线程程序的每个帮助器线程都有自己的线程栈。

主栈的缺省大小约为 8 兆字节。线程栈在 32 位系统上缺省大小为 4 兆字节,在 64 位系统上缺省大小为 8 兆字节。limit 命令(不带参数)可显示当前的主栈大小。如果使用 -stackvar 时出现段故障,请尝试增加主栈和线程栈的大小。

示例:显示当前的栈大小:


demo% limit
cputime         unlimited
filesize        unlimited
datasize        523256 kbytes
stacksize       8192 kbytes      <–––
coredumpsize    unlimited
descriptors     64
memorysize      unlimited
demo%

示例:将栈大小设置为 64 兆字节:


demo% limit stacksize 65536

示例:将每个线程栈大小设置为 8 兆字节:


demo% setenv STACKSIZE 8192

通过为 STACKSIZE 环境变量指定值(单位为千字节),可以设置每个从线程使用的栈大小:

% setenv STACKSIZE 8192

将每个从线程的栈大小设置为 8 MB。

STACKSIZE 环境变量还接受带有 B(字节)、K(千字节)、M(兆字节)或 G(千兆字节)后缀的数值。缺省单位为千字节。

有关与并行化一起使用 -stackvar 的详细信息,请参见《Fortran 编程指南》的“并行化”一章。有关 limit 命令的详细信息,请参见 csh(1)。

使用 -xcheck=stkovf 进行编译,可启用栈溢出情况的运行时检查。请参见3.4.120 –xcheck=keyword