【问题标题】:How do fortran 77 programmers manage without dynamic memory allocation?fortran 77 程序员如何在没有动态内存分配的情况下进行管理?
【发布时间】:2017-03-30 14:06:28
【问题描述】:

我开始学习 Fortran,具有 C++/Matlab/Java 背景。我意识到一些 Fortran 程序员仍然坚持使用 F77,可能是因为他们不喜欢面向对象、命名空间之类的东西,并且习惯了旧语法。

我知道您可以编写没有 OOP 的程序。我不明白的是,如果没有动态内存管理,你怎么办。有一千个您事先不知道数组大小的示例 - 例如将完整矩阵转换为稀疏矩阵时。

当然,现代 Fortran 提供“自动数组”和“可分配数组”。但这些在 1977 年并不存在。没有这些构造,F77 家伙如何管理?

【问题讨论】:

  • FORTRAN 77 曾经/现在主要用于科学计算,其中一些选定的初始条件(例如固定大小的字段)在很长一段时间内演变,写出数据。运行期间没有用户输入,您确切知道阵列需要多大。 Fortran 代码通常被认为更高效的部分原因。
  • @Ed Smith 好吧,在科学计算中肯定有很多固定大小的应用(例如数值线性代数),但也有很多未知大小的应用(非结构化网格划分、可变步长的时间积分,稀疏矩阵等)
  • 很难用 fortran77 实际编译,因为大多数编译器都是 F90、F95 或更高版本,并且它们向后兼容。所以大多数稳定的 F77 代码不需要更改,或者通常不需要更改。即使是从 F77 开始的青少年,也将 >= 40,而 F90 大约存在 2.5 年。第一次计算出 ALLOCATABLE 大约需要 10 分钟,但它很容易放入。如果代码以流方式在 32k 部分上工作,那么保持原样通常更容易。
  • 在我知道的一个大型 F77 程序中,它首先使用 C malloc() 分配一大块内存(根据启动时来自输入文件的用户请求),然后程序使用类似堆栈的机制来访问该内存的一部分。通过使用只有长度为 1 的数组的公共块(例如,common /MEM/ X(1))并让子程序知道与 X(1) 的地址的偏移量和(第一个元素) C 分配的内存,加上每个例程请求的必要数量。所以这很尴尬,但仍然在该代码中用作主内存机制:)
  • 自动数组是80年代在多个平台上支持的扩展,因此被f90采用

标签: fortran dynamic-memory-allocation fortran77


【解决方案1】:

在标准语言中,该方法通常是在一个比可能需要的更大的阵列中留出存储空间,但仍然在运行程序的平台的限制范围内,然后根据需要手动分配该存储空间。该语言的特性,例如序列关联、存储关联和可调整的数组,有助于这种分割。

使用语言扩展进行动态内存管理也很常见。

Fortran 77 及更早版本的功能需要结合当时平台的功能来考虑。

【讨论】:

  • 所有有效积分。我可能“太年轻”,无法真正掌握过去 60 年计算机和语言的伟大革命。我想早期的内存非常昂贵,以至于手动管理可变长度数组是有意义的。类似 malloc 的结构由语言扩展或外部过程提供也是有道理的,直到它们最终被 F90 采用。 (另外,我开始意识到 F77 实际上比第一个 C 标准更老......)
  • 请记住,Fortran 90 是 much delayed。它的一种形式最初被称为 Fortran 82!
  • 我记得我们在 80 年代初有一台机器在工作,它有一个 5MB 的可移动硬盘驱动器,那台机器有 32k 的 RAM……看起来很快,但几乎所有东西都需要通过代码流式传输.今天工作的机器有 40 个内核和 192GB 的 RAM 和 10TB RAID,在一个向量中,我有一个 200M 的空间,我分配并放入堆栈......我在许多内核上运行多个实例,我通常I/O 受限。从字面上看,一切都好一百万倍/更多/更大。
  • 通常,可怕的游戏是用 COMMON 块和 EQUIVALENCE 语句来解决缺乏动态的。COMMON 块被实现为连续的内存块,因此通过重新定义块中的变量,可以滚动你自己的动态内存池。 EQUIVALENCE 语句是指针的权宜之计。最终结果通常是精心调整的无法维护的破坏行为,只有普通的 C 应用程序才能与之匹敌;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-26
  • 2020-03-28
  • 2017-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多