正确使用PURE关键字Fortran

Riv*_*ver 17 fortran keyword fortran90 fortran95

我正在钻研Fortran,我遇到了pure关键字,指定了没有副作用的函数/子程序.

我有一本书,S Chapman的Fortran 90/95,它引入了pure关键字,但奇怪的是没有提供"良好的编码实践"用途.

我想知道如何在程序中使用这个关键字.只是环顾四周,对我来说很明显,大多数没有副作用的程序都没有必要包含pure关键字.

那么它最好用在哪里?只有在程序中才能完全保证没有副作用?或者也许在程序中,计划elemental稍后转换为程序?(elemental必须首先执行程序pure.)

Ian*_*anH 12

PURE在某些情况下是必需的 - 例如,在规范表达式中调用的过程或来自FORALLDO CONCURRENT构造的过程. PURE在这些情况下,要求Fortran处理器在过程调用的顺序方面具有灵活性,同时仍然具有来自特定代码段的合理确定性结果.

除了这些必要的案例之外,无论是否使用PURE都基本上是一种风格问题,这在某种程度上是主观的.

使用PURE(无法在程序中执行IO,无法调用非程序PURE)和成本(今天编写的纯程序可以从明天编写的上下文中调用,需要纯程序,因为PURE程序没有任何一方的成本)对代码的读者来说,调用这样一个过程的含义可能会更清楚,两者之间的权衡取决于细节.

该标准可以为Fortran处理器提供相当大的方法,使他们能够评估表达式中的表达式和函数引用.它肯定会在某些方面限制程序围绕函数执行的副作用和函数参数的修改.对纯函数的要求与那些约束和那些约束一致,因此有些人使用大多数函数都是纯粹的样式.同样,它可能仍然取决于具体情况,并且可能必须存在例外情况,例如C互操作性或与外部API的交互.


Ste*_*nel 6

正如chw21所建议的那样,主要的动机PURE是允许编译器更好地进行优化.特别是,PURE由于未知的副作用,缺乏功能将阻止并行化.请注意PURE,与函数不同,子例程可能有INTENT(INOUT)参数,但是仍然存在对副作用的限制(并且PURE过程只能调用其他PURE过程.)

通过Fortran 2003,ELEMENTAL程序是隐含的PURE.Fortran 2008添加了一个IMPURE前缀,可以与ELEMENTAL过程一起使用来禁用该方面.