我最近发现Fortran中纯函数和子程序的用法。根据Fortran手册所示,似乎我的大多数子程序实际上都可以定义为纯函数(因为我总是指定所有参数的意图,并且通常在大多数子程序中没有"save"、"pause"或外部I/O)。 那么我的问题是:我应该这样做吗?我想知道编译器是否优化纯函数更好,还是根本不重要,或者会让情况变得更糟。 谢谢!
我最近发现Fortran中纯函数和子程序的用法。根据Fortran手册所示,似乎我的大多数子程序实际上都可以定义为纯函数(因为我总是指定所有参数的意图,并且通常在大多数子程序中没有"save"、"pause"或外部I/O)。 那么我的问题是:我应该这样做吗?我想知道编译器是否优化纯函数更好,还是根本不重要,或者会让情况变得更糟。 谢谢!
与编译器协作生成良好代码,您提供的信息越多,您和编译器就可以更好地合作。
无论是使用intent(in)
为您不更改的任何虚拟参数进行标记,还是对常量使用parameter
,或者明确将没有任何副作用的子程序标记为pure
,或者在您并不真正关心循环计算顺序时使用forall
,通过更加明确地表达您想要发生的情况,您将获得以下好处:
在这三个好处中,优化可能并不是最重要的;在纯函数的情况下,聪明的编译器可能可以通过静态分析看到您的子例程没有副作用。 尽管如此,您能够提供的保证越多,它就可以更好地优化您的代码而保持正确性。
pure
关键字作为副作用检测器。只需将编写的所有函数声明为pure
。如果函数具有副作用,编译器会发出警告。如果发生这种情况,请考虑是否可以重构它以成为无副作用的函数,否则请删除pure
。这样,您将更好地理解代码并自动编写更干净的代码。 - user26756