为什么Fortran中的指针需要一个目标(TARGET)?

22
为什么 Fortran 90规范(5.2.8)要求使用TARGET关键字来将指针与其关联?为什么不是每种类型都是有效的目标?
例如,
INTEGER, POINTER :: px
INTEGER, TARGET :: x
x = 5
px => x
有效的语法,但是
INTEGER, POINTER :: px
INTEGER :: x
x = 5
px => x
无效
为什么必须这样做?
3个回答

22

可能会被指向的项可以别名到另一项,编译器必须允许这样做。没有目标属性的项目不应该被别名,编译器可以基于此做出假设,从而生成更高效的代码。


我的上一个评论不准确。指针/目标关联可能会导致一些非常棘手的情况。如果您在Fortran中没有经验,我建议您进行进一步阅读以了解指针/目标关联实践。例如,请参阅此链接https://software.intel.com/en-us/forums/intel-fortran-compiler-for-linux-and-mac-os-x/topic/709550 - Mali Remorker

2

Fortran中的指针与C中的指针不同。在Fortran 90中,指针提供了很少的限制,比如必须有一个目标。这是为了解决速度问题和保证指针使用的安全性。虽然可以创建可分配的指针,它们不需要指定目标。深入挖掘,您会找到它们!


0

为了更好的编译器优化。当你的代码在1K-100K个核心上运行时,速度确实很重要。

顺便说一下,TARGET并不总是被使用。例如,在使用指针进行内存分配的情况下。

...
real, pointer :: p(:), x
...
allocate(p(15))
...
x => p(1:5)
...
nullify(x)
deallocate(p)
...

根据编译器的不同,你需要分配(x(5))才能使其正常工作。 - AlanSE
@AlanSe 请问使用哪个编译器?这组代码看起来是正确的。 - Francois Jacq
3
@user49734 这里不需要使用“TARGET”(并且甚至是禁止的),因为指针总是可以被作为“目标对象”。 - Francois Jacq

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