2013-04-28 48 views
1

我知道兩個變量,比如a1和a2出現在Fortran中的Equivalence(a1,a2)語句中,然後它們佔據相同的內存空間。所以說這發生在一個過程中,其中a1和a2是該過程中的局部變量。Fortran中的「等價」

這意味着你不僅可以在內存中擁有a1和a2的副本嗎?因爲其中一個值將被覆蓋。你可以將a1保留在內存位置,並將a2保存在整個過程的註冊表中,這樣會好嗎?

我的問題基本上是:你可以在整個過程中註冊a1嗎?

我會說是的...除非你用盡了寄存器和A1必須存儲回內存。然後你將覆蓋a2並丟失它的值,然後變量a1和a2將實際指向a1的值。

回答

5

a1a2equivalence語句中表示這兩個變量將佔用相同的存儲空間。即使它們是不同類型的變量(例如,a1是整數,a2是真實的),更改一個也會改變另一個。 Fortran並沒有給你任何指定變量應該在寄存器中的方法,並且看起來極有可能是一個equivalence語句會自動禁止編譯器這樣做。

所以

你可以保留在存儲位置A1和A2保持在寄存器 整個過程,這點會被罰款嗎?

不適用。

我強烈建議不要使用equivalence ......這是有害的,可能只保留在語言中以支持遺留代碼。如果您需要跨類型傳輸數據,則現代Fortran方法是內部函數transfer

+0

感謝您的回答。您能否從理論意義上回答這個問題,即從Fortran程序員的角度來看?我們正在編寫一門關於編譯器的課程,這是我們正在修改的一個問題,所以更多的是關於註冊分配而不是Fortran的使用(我們根本不用Fortran編程)。 – Awoken 2013-04-29 00:32:06

+1

如果將a1和a2放入不同的地方,例如一個放在RAM中,另一個放在寄存器中,那麼程序就很難像等價語句那樣工作。每當一個變量的值發生變化時,編譯器生成的可執行文件也必須更新其他變量。 – 2013-04-29 01:11:58

+0

只要考慮'等價性'作爲記憶中某個地方的別名。可能與類型轉換。 – 2013-04-29 10:38:16

2

使用equivalence的唯一原因是爲同一件事物有兩個名字。作爲Fortran程序員,您無法控制寄存器或任何此類事物。不要考慮內存和寄存器。認爲你有兩個名字的「盒子」。無論您使用哪個名稱,您都可以在同一個存儲箱中存儲或檢索。