我目前在学习Fortran,遇到了 pure
关键字,该关键字指定了没有副作用的函数/子程序。
我有一本书,作者是S Chapman,名为《Fortran 90/95》,介绍了 pure
关键字,但奇怪的是没有提供好的编码实践用例。
我在想,在过程中应该自由地使用这个关键字吗?仅在需要完全保证无副作用的程序中使用?还是在计划稍后转换为 elemental
程序的程序中使用?(因为 elemental
程序必须先是 pure
。)
PURE
,例如,在规范表达式内部调用的过程或从FORALL
或DO CONCURRENT
结构中调用的过程。在这些情况下需要使用PURE
,以便为Fortran处理器提供过程调用顺序的灵活性,同时仍然能够从特定代码段得出相当确定的结果。PURE
基本上是一个风格问题,这在某种程度上是主观的。PURE
也有一些代价(无法在过程内进行IO操作,不能调用不是PURE
的过程)和好处(今天编写的纯过程可以在明天编写的需要纯过程的上下文中调用,因为PURE
过程没有副作用,这样调用的含义可能更清晰),两者之间的权衡取决于具体情况。pure
的其他有用信息,应该查看更多关于如何让编译器通过乱序并行化进行优化的内容。 - Riverf
并在表达式 x=f(a*b)+f(a*b)
中使用它,那么 f
总是被调用一次吗?似乎无法测试是否为真,因为这需要将某种副作用放入函数中。 - Raul Laasnerf
可能被调用零次、一次或两次,这与 f
是否为纯函数无关。 - IanHf(arg)+f(arg)
优化为2*f(arg)
,无论是否有pure
声明。 - agentpPURE
的主要动机是让编译器更好地进行优化。特别地,对于未被声明为PURE
的函数将阻止由于未知副作用而进行的并行处理。请注意,PURE
子程序(与函数不同)可能具有INTENT(INOUT)
参数,但仍然存在副作用限制(并且PURE
过程只能调用其他PURE
过程)。ELEMENTAL
过程隐含为PURE
。Fortran 2008添加了一个IMPURE
前缀,可用于与ELEMENTAL
过程一起使用以禁用该方面。gfortran
或ifort
中使用它,但没有看到任何好处。 - Alexander Vogtpure
关键字的好处,但我仍然想了解它通常如何使用。它应该尽可能使用吗?还是更类似于位操作、多线程和其他只有在速度非常重要的情况下才普遍存在的东西? - River
pure
关键字吗?根据我查看的Fortran代码,这似乎不是标准使用方法。 - River