在以太坊Solidity中關鍵詞 memory
的含義或者說作用(purpose)是什麼?
在檢視智能合約時,有時數組arrays用
memory
來聲明,有時不是。有什麼差別不同嗎? 以太坊開發語言solidity中的memory
沒有
memory
這個關鍵字,solidity在存儲
storage
中聲明變量。
上司Solidity開發的chriseth這麼說:”你可以把存儲
storage
看作是一個大的數組,它有一個虛拟結構,一個在運作時不能改變的結構——它是由你的智能合約中的狀态變量決定的”。
也就是說,在基于智能合約級别的變量聲明在智能合約建立時,存儲結構是在
stone
中設定的,并且不能被将來的方法調用和更改。但是,存儲的内容可以用
state variables
調用來改變。這樣的調用改變了
state
,這就是為什麼合約級變量被稱為狀态變量。是以,在合約級别聲明的變量
uint8
存儲變量可以更改為uint8(0~255)的任何有效值,但是uint8類型的值的
slot
槽位将始終存在。
如果在沒有
memory
關鍵字的函數中聲明變量,那麼solidity将嘗試使用目前已經編譯好的存儲結構,但會産生意想不到的結果。
memory
告訴solidity,以便在方法運作時為變量建立一塊空間,保證其大小和結構,這樣将來就可以在該方法中使用。
memory
不能在合約級别使用。隻有方法中使用。
以太坊虛拟機存儲
以太坊虛拟機有三個可以用來存儲的區域:
- 1.第一個是
存儲,所有的智能合約狀态變量都駐留在其中。每個合約都有自己的存儲,它在函數調用之間是持久的,但使用起來相當昂貴。storage
- 2.第二個是
記憶體,這是用來儲存臨時值的。它在(外部)函數調用後被清除,使用起來更便宜。memory
- 3.第三個是stack棧,用來儲存小的局部變量。它幾乎是免費使用的,但隻能維護有限數量的值。
對于幾乎所有類型,都不能指定它們存儲的位置,因為它們每次使用時都會被複制。
所謂存儲位置重要的類型是結構和數組。如果你在函數調用中傳遞這些變量,那麼如果它們可以留在
memory
記憶體中或留在
storage
存儲中,它們的資料就不會被複制。這意味着你可以通過調用函數中修改它們的内容,這些修改對調用方仍然可見。
存儲位置的預設值取決于它關注的變量類型:
- 狀态變量總是存儲在
中。storage
- 函數參數總是存儲在
memory
- 結構
、數組struct
或映射array
類型的局部變量預設引用存儲在mapping
。storage
- 在堆棧中隻是存儲值類型的局部變量(即,既不是
數組,也不是array
結構也不是struct
映射)。mapping
原文:
http://cw.hubwiz.com/card/c/ethereum-FAQ/1/1/2/另外推薦一些之前的教程: