2011-01-18 120 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