我已经读过应用DEALLOCATE到分配的数组可以释放它正在使用的空间。我在我的程序中处理了几个可分配的数组,但从不费心解除分配它们。有没有一种方法来确定是否/如何不解除分配影响执行时间?
提前致谢
PS:我不倾向于直接做这个测试(通过比较有和没有释放的执行时间),因为程序依赖于随机变量,其值最终会影响性能。
我已经读过应用DEALLOCATE到分配的数组可以释放它正在使用的空间。我在我的程序中处理了几个可分配的数组,但从不费心解除分配它们。有没有一种方法来确定是否/如何不解除分配影响执行时间?
提前致谢
PS:我不倾向于直接做这个测试(通过比较有和没有释放的执行时间),因为程序依赖于随机变量,其值最终会影响性能。
事实上,释放释放了变量占用的内存,但并不总是需要手动执行。
如果您知道不再需要变量的内容并且需要为要分配的其他变量(或系统)释放内存,则可以使用该deallocate语句。
但是,当变量超出范围(@francescalus 指出的 Fortran 95 或更高版本)或到达程序末尾时,会自动发生解除分配。
此外,如果数组的维度不一致或变量是多态的并且必须采用符合要求的动态类型,则在分配之前,必要时会自动进行解除分配。(此行为是 Fortran2003 或更高版本,可能需要在某些编译器上打开)。
此外,当分配的对象与具有属性的虚拟参数关联时,INTENT(OUT)在进入过程之前会发生解除分配。
**指针变量警告:**
如果您pointer显式地为变量分配存储空间(使用allocate语句),然后执行指针关联 ( =>),则释放不会自动发生。您有责任在执行此操作之前释放变量,否则会发生内存泄漏。
最后一点,尝试解除分配未分配的变量会引发错误。您可以检查是否使用内部函数分配了可分配变量allocated。
不再需要释放变量会影响执行速度吗?是的。它可能出现在“正常”程序中吗?不,如果不能防止内存泄漏。
我知道没有有价值的启发式方法可以帮助您确定释放“速度”的有用性。
如前所述,为了正确或避免内存泄漏,可能需要解除分配。
但是,如果程序需要对可分配变量进行终结以确保正确性,则需要为其deallocate声明:当停止或结束程序语句导致执行终止时,不会发生终结。
在过程(子例程或函数)中声明的没有save属性的可分配变量(所谓的未保存的局部变量)在过程结束执行时自动释放。
但是,作为历史记录,在 Fortran 90 中并非如此。在 Fortran 90 中,此类变量没有被释放,更糟糕的是它们的分配状态变得未定义(因此甚至无法查询分配状态)。一个真的想要一个deallocate那里。这个缺陷在 Fortran 95 中得到了纠正,但习惯和代码可能会存在很长时间。