2011-01-18 115 views
12

为什么Fortran 90 Specification指定(5.2.8)必须使用TARGET关键字来将POINTER关联到它?为什么不是每个类型都是有效的目标?为什么Fortran POINTER需要一个TARGET?

例如,

 
INTEGER, POINTER :: px 
INTEGER, TARGET :: x 
x = 5 
px => x 
有效语法,但
 
INTEGER, POINTER :: px 
INTEGER :: x 
x = 5 
px => x 
无效

这是为什么呢?

回答

15

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

+0

我之前的评论并不准确。指针/目标关联会导致一些非常棘手的情况。如果您对Fortran中的指针/目标关联实践没有经验,我建议您进一步阅读。例如,请参阅此链接https://software.intel.com/en-us/forums/intel-fortran-compiler-for-linux-and-mac-os-x/topic/709550 – 2017-01-31 09:34:41

2

fortran中的指针与c中的指针不同。在90分钟的比赛中,只有少数人有限制的目标。这是为了解决速度问题并保持指针使用安全。尽管一次调用会生成不需要指定目标的可分配指针。深入挖掘,你会发现它们!

0

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

btw TARGET并不总是被使用。例如,在指针用于分配内存的情况下。

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

根据编译器的不同,你必须分配(x(5))才能工作。 – AlanSE 2011-12-18 03:12:54