3

从商业程序的程序员手册中发布的源代码中,我分离出了​​一个让我很困惑的代码片段。

下面的函数预计会被内核多次调用,并且应该在由许多互连组件组成的系统中实现组件的时间行为(我已经从函数原型中删除了输入/输出参数,因为它们与我打算提高的点)。

为了区分相同块类型的不同实例,内核在 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
4

1 回答 1

4

存储方法不是语言标准的一部分。旧的 FORTRAN 编译器(FORTRAN 77 和更早版本)经常静态存储所有变量。该语言要求您对变量使用“SAVE”,在调用过程时应保留其值。但由于 FORTRAN 77 时代编译器的典型设计,许多程序员忽略了这一要求,并依赖于所有变量都保留其值的行为。

现代 Fortran 编译器通常以不同的方式使用内存,如果省略 SAVE,过程的局部变量并不总是保留它们的值。当使用当前编译器编译旧程序时,这经常会导致错误。编译器通常提供恢复旧行为的选项。否则,识别大型遗留程序中需要将 SAVE 属性添加到其声明中的所有变量可能需要大量工作。

于 2013-03-14T16:43:28.977 回答