gpt4 book ai didi

fortran - FORTRAN 在哪里存储局部变量?

转载 作者:行者123 更新时间:2023-12-04 02:59:15 25 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

关于fortran - FORTRAN 在哪里存储局部变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15414277/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com