【问题标题】:Is there a difference memory-wise between using Common Blocks and Modules in Fortran 90在 Fortran 90 中使用通用块和模块在内存方面是否存在差异
【发布时间】:2014-07-09 09:03:35
【问题描述】:
我最近在没有任何指导的情况下学习 Fortran,并尝试了不同的版本。我从this site找到:
MODULE 比 COMMON 块更好吗?
几乎总是是的。使用 COMMON 块的唯一原因是,如果您
期望在只有 FORTRAN 77 的计算机上使用您的程序
编译器(它们仍然存在),或者如果您非常重要
控制数据在内存中的存储顺序。
嗯,使用模块在语法上肯定比使用通用块更甜。但是在这两种情况下,内存使用和分配有什么区别?它在性能和访问速度方面也有影响吗?这个问题有意义吗?
【问题讨论】:
标签:
module
fortran
fortran90
fortran-common-block
【解决方案1】:
M.S.B.在他的回答中有它,但在我看来并没有足够强调它。 COMMON 块中的变量完全按照块定义中的顺序排列在内存中。从这个限制,没有动态内存对象(可分配,指针)可以在 COMMON 块中,紧随其后。
“序列关联”意味着您可以依靠变量的放置方式,例如,使用以下两个数组作为一个大数组。
COMMON 块在现代代码中可能没有位置,尽管它们没有被宣布为过时。
在速度方面,如果变量相同,访问它应该没有任何区别,无论是在模块中还是在COMMON块中。
【解决方案2】:
内存方面的一个区别是您可以在模块中使用可分配数组,但不能通用。 (见Fortran common variables, allocatable array)。如果您有一个在编译时不知道数组大小的数组,则会方便得多。旧的 FORTRAN 方法是将数组声明为某个希望足够大的巨大尺寸的数组,但这通常会浪费空间。使用可分配数组,您可以按所需的精确大小分配数组。
我从不在新代码中使用 COMMON。它更受限制,并带来了不必要的“序列关联”,即通过变量在内存中的布局来关联变量。