【发布时间】:2019-02-04 22:17:21
【问题描述】:
如果我的编译器兼容 Fortran 2003,我可以重新分配可分配变量或数组,而无需像 Automatic array allocation upon assignment in Fortran 中所述的显式解除/分配过程。例如
integer, allocatable :: i(:)
i = [1,2,3]
i = [1,2,3,4,5]
与旧的(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]
这种新技术有什么优点和缺点?它肯定比旧方法更简洁的代码。但是有理由更喜欢旧方式吗?我仍然在代码示例中看到旧方式比新方式更多,但这可能只是因为 Fortran 90 仍然比 Fortran 2003 使用更多。
作为一个快速的时间检查,我在 gfortran 4.8.5 下循环了上面的代码 100,000,000 次,发现新的方式似乎也更快,运行大约 4 秒(新方式)与 6 秒(旧方式)。相反,在@roygvib 下面的 cmets 中,与 gfortran 8.2 的结果基本相反。
另外,请注意这里最近对该问题的讨论:Fortran Discussion Group
【问题讨论】:
-
在欺骗问题中,请参阅右侧的 Linked 以了解更多类似问题。
-
在这种情况下,您应该以明确与非重复方面有关的方式编写问题,而不是添加仍然留下其他地方解释的那些点的编辑,重新编写问题!好的,我为你做了...
-
其他问题似乎围绕“我有一个错误”的主题展开,而这个问题涉及两种编程风格之间的比较。
-
@JohnE 没有什么可以阻止您完善问题,阻止您在关闭或“暂停”时完善问题。恰恰相反,关闭消息通常明确地包含如何重新打开它的指令。唉,我自己做了这样的编辑,然后重新打开了你的问题。
-
我刚刚尝试比较上述两种模式的 10^8 循环,但使用 gfortran-8.2 -O3 的第二个版本更快(约 40%)。另一方面,有点旧的 PGI fortran 给出了基本相同的时间。所以结果可能会因编译器而异?
标签: fortran