如果我的编译器兼容Fortran 2003,我可以重新分配可分配变量或数组,而无需显式解除分配/分配过程,如Fortran 中分配时自动数组分配中所述。例如
integer, allocatable :: i(:)
i = [1,2,3]
i = [1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)
与旧的(Fortran 90)方式相比:
if( allocated(i) ) deallocate(i)
allocate(i(3))
i = [1,2,3]
if( allocated(i) ) deallocate(i)
allocate(i(5))
i = [1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)
这种新技术有什么优点和缺点?这肯定是比旧方法更简洁的代码。但有理由选择旧方式吗?我在代码示例中仍然看到旧方法比新方法多得多,但这也许只是因为 Fortran 90 的使用仍然多于 Fortran 2003。
作为快速计时检查,我在 gfortran 4.8.5 下循环上述代码 100,000,000 次,发现较新的方式似乎也更快,运行时间约为 4 秒(新方式),而运行时间为 6 秒(旧方式)。相反,在下面的评论中,@roygvib 得到的结果与 gfortran 8.2 基本相反。
另外,请注意这里最近对该问题的讨论: Fortran 讨论组