arrays - Fortran 中没有 Allocate() 的可变大小数组

标签 arrays memory fortran heap-memory stack-memory

有没有办法在 Fortran 中创建可变大小的数组在堆栈上? Allocate() 对我不起作用,因为它将数组放在堆上。这可能会导致并行化问题(请参阅我的另一个问题: OpenMP: poor performance of heap arrays (stack arrays work fine) )。当然,一些智能内存管理可以解决这个问题,但是 Fortran 中的内存管理听起来很傻。

基本上,我正在寻找与 C 语言中以下内容的 Fortran 等效项:

scanf("%d", N);
int myarray[N];

重申:我不想

Integer, PARAMETER :: N=100
Integer, Dimension(N) :: myarray

因为这决定了编译时的数组大小。我也不想

Integer, Dimension(:), Allocatable :: myarray
read(*,*) N
Allocate(myarray(1:N))

因为它将数组放在堆上。

帮助非常感谢。在我最近遇到上述问题中的问题之前,我对 Allocatable 数组非常满意。如果对这个问题有否定的答案,我将非常感谢源链接。

编辑:查看对 M.S.B. 答案的评论。只有在 Fortran 2008 中才有可能做到这一点的优雅方式,并且它是在 block 构造中完成的。

最佳答案

Fortran 可以自动创建数组,只需要在子例程的入口处声明,只要在运行时知道维度……这不需要声明维度参数属性,它们可以是参数,例如,

subroutine MySub ( N )

integer, intent (in) :: N
real, dimension (N) :: array

有效。那么为什么不在主程序或某个子程序中决定你的大小“N”,然后调用另一个子程序继续。使用这种方法,数组可能会在堆栈上。正如@eriktous 所写,Fortran 语言标准没有指定这种行为。一些编译器将本地数组切换到超过一定大小的堆。一些编译器提供了控制这种行为的选项。在堆上放置大型数组可能会被递归或 OpenMP 覆盖。

您还可以将可分配数组作为实际参数传递给子例程,而无需将子例程的虚拟参数声明为可分配的。这可能对您的担忧没有帮助,因为原始数组可能仍然在堆上。

关于arrays - Fortran 中没有 Allocate() 的可变大小数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6617015/

相关文章:

javascript - 将对象数组中的特定值转换为小写

c - 用多维数组参数表示函数的方法

c - 错误 :"pointer being realloc' d 未分配”在 macOS 上,但在 Windows 上尝试重新分配两次时有效

java - 对已创建对象进行新引用的处理成本?

fortran - Fortran 中的 CEILING 和 FLOOR 函数 - 它们不应该返回整数吗?

fortran - 大型阵列导致 OpenMP 崩溃

python - 计算数据框中列的每一行中数组的每个唯一数组

python - numpy 除法的问题

java - 如何在 java 中执行内存高效的数组排序?

makefile - 使用静态库进行编译的通用 Gfortran Makefile