equivalence
是Fortran的兩個特性之一,用於存儲關聯的實體。 (另一個是common
塊,我將在這裏保持沉默的話題)。 equivalence
聲明聲明在其參數列表中命名的實體共享相同的存儲位置。在這種情況下,data1
和data2
共享相同的內存位置。
如果您有檢查內存位置的工具,並在data1
指向它,你會看到這樣的內容:
+----------+----------+----------+----------+----------+----------+
| | | | | |
| data1(0) | data1(1) | data1(2) | data1(3) | data1(4) | data1(...
| | | | | |
+----------+----------+----------+----------+----------+----------+
點data2
相同的工具,你會看到這樣的事情
+----------+----------+----------+----------+----------+----------+
| | |
| data2(0) | data2(1) | data2(....
| re im | re im | re im
+----------+----------+----------+----------+----------+----------+
但 '真理' 是不如說更像
+----------+----------+----------+----------+----------+----------+
| | |
| data1(0) data1(1) | data1(2) data1(3) | data1(4) data1(...
| | |
| data2(0) | data2(1) | data2(....
| re im | re im | re im
+----------+----------+----------+----------+----------+----------+
data1(0)
與data2(0)
的實際組件位於相同的位置。 data1(1)
是data2(0)
的虛構成分,等等。
這是equivalence
的應用之一,它仍然偶爾遇到 - 可以在查看數據之間切換爲complex
或成對reals
。然而,它並不侷限於這種類型轉換,沒有什麼可以說你不能等價的整數和實數,或任何其他類型。
偶爾還會看到的另一個用途是使用equivalence
將陣列從一個等級重新映射到另一個等級。例如,給定
integer, dimension(3,2) :: array2
integer, dimension(6) :: array1
和
equivalence(array1(1),array2(1,1))
可以被視爲屬於秩-2陣列或秩1陣列以適應程序的需要相同的元件。
equivalence
這些日子一般都會皺眉,現在的大多數已經被使用的功能可以用現代Fortran更安全地完成。對於更多,你可能會關心看看我的回答Is the storage of COMPLEX in fortran guaranteed to be two REALs?
感謝您的鏈接,我找不到它之前。 – mfakhrusy
@HighPerformanceMark因此,讓我說,如果DATA1(0)包含值1,那麼DATA2(0)對於實部和虛部都包含1的值? – mfakhrusy
data1(0)和data1(1)是data2(0)的實部和虛部。 – agentp