指针会限制编译器优化吗?

6
我试图将一个数组传递给子程序,该子程序中声明为假定形状数组。这样导致了一些问题,我已经通过传递指针来解决了这些问题。
但是某个声望很高的用户在评论中告诉我:
“添加指针也是告诉编译器优化器,今天无需执行任何工作的合理方式。”
有人能简短地解释一下吗?该语言是Fortran 95,尽管我相信这适用于其他语言。

我认为OP指的是这条评论 - 4castle
1
它是真的。 对于SIMD来说,很难保证数据是连续的,无论点是顺序索引还是非顺序索引。对于大多数语言而言,Fortran更可能是正确的,因为很多Fortran都专门针对向量/数组。但编译器的实质都在接近一个渐近线,使得Fortran和C之间的汇编代码几乎相同。通常指的是某些东西,而且更复杂的代码需要更多的工作。 - Holmz
1
@4castle,我故意没有提供原始评论的链接,因为其中包含误导性信息:(通过使用指针)“您将无法再传递数组部分”,这是错误的。在将数组部分作为参数传递给子程序之前,将指针分配给它绝不是什么难事。 - Mephisto
1个回答

4

是的,Fortran编译器必须假设指针可以与其他指针和target变量别名。

如果您有指针数组ab,则

  a(i) = a(i) + b(i)

编译器必须假设这两个数组可能部分重叠,并且必须禁止某些优化,因为更改a的值可能会在某个未知索引处更改b的某个值。
另请参见C语言的restrict关键字和Is Fortran easier to optimize than C for heavy calculations?中对指针别名提出的更全面的讨论。不必再重复所有讨论了。
IanH的评论可能有点过于强烈,但其中有很多真相。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接