从商业程序的程序员手册中发布的源代码中,我分离出了一个让我很困惑的代码片段。
下面的函数预计会被内核多次调用,并且应该在由许多互连组件组成的系统中实现组件的时间行为(我已经从函数原型中删除了输入/输出参数,因为它们与我打算提高的点)。
为了区分相同块类型的不同实例,内核在 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