我试图将数组传递给子程序,在子程序中将其声明为假定的形状数组。这给了我一些我通过传递指针而能够解决的问题。
但是一些声誉很高的用户在评论中告诉我:
添加指针也是告诉编译器优化器它今天不需要做任何工作的合理方法。
有人可以就此提供简短的解释吗?该语言是Fortran 95,但我相信这适用于其他语言。
答案 0 :(得分:4)
是的,Fortran编译器必须假设指针可以使用其他指针和target
变量进行别名。
如果你有指针数组a
和b
,那么
a(i) = a(i) + b(i)
编译器必须假设这两个数组可能部分重叠,并且必须禁止某些优化,因为更改a
的值可能会在某个未知索引处更改b
的某些值。
另请参阅C restrict
关键字,并在Is Fortran easier to optimize than C for heavy calculations?进行更全面的讨论。不值得重复有关在那里引发的指针别名的所有观点。
IanH的评论故意有点过于强烈,但其中有很多道理。