从商业程序程序员手册中发布的源代码中,我已经分离了一段令我困惑的代码片段。
下面的函数应该由内核多次调用,并且应该在由许多互连组件组成的系统中实现组件的时间行为(我已经从函数原型中删除了输入/输出参数,因为它们与我打算上升的观点无关。)
为了区分相同块类型的不同实例,内核在INFO(1)元素中传递实例编号。
据我所知,该程序的设计者花费了大量精力试图节省将参数值从PAR向量复制到每次调用时具有有意义名称的局部变量所花费的时间(就好像他们不知道编译器可以做的优化。在我看来,他们只想在第一次调用中将它们分配给局部变量,或者当调用者切换到同一类型的不同实例时。
但是,如果使用“save”关键字未将局部变量声明为静态,我无法理解这是如何工作的。 FORTRAN是否静态存储局部变量,即不在堆栈上? (我很抱歉,如果这个问题听起来很愚蠢,我已经习惯了C / C ++语言)
谢谢。
SUBROUTINE TYPE151(PAR, INFO, *)
IMPLICIT NONE
INTEGER*4 INFO(15), IUNIT
DOUBLE PRECISION PAR, QMAX
PARAMETER (NP=1)
DIMENSION PAR(NP)
! First call
IF (INFO(7).EQ.-1) THEN
IUNIT = INFO(1)
QMAX = PAR(1)
RETURN 1
ENDIF
! later calls
IF(INFO(1).NE.IUNIT) THEN
IUNIT = INFO(1)
QMAX = PAR(1)
ENDIF
! Making use of QMAX in some ways...
RETURN 1
END SUBROUTINE TYPE151
答案 0 :(得分:2)
存储方法不是语言标准的一部分。旧的FORTRAN编译器(FORTRAN 77及更早版本)经常静态存储所有变量。该语言要求您对变量使用“SAVE”,在对过程的调用中应保留这些变量。但是许多程序员忽略了这一要求,并依赖于所有变量保留其值的行为,因为FORTRAN 77时代的编译器的典型设计。
现代Fortran编译器通常以不同方式使用内存,如果省略SAVE,则过程的局部变量并不总是保留其值。当使用当前编译器编译旧程序时,这经常会导致错误。编译器通常提供恢复旧行为的选项。否则,识别需要在其声明中添加SAVE属性的大型遗留程序中的所有变量可能需要做大量的工作。