2015-11-21 29 views

回答

25

如果沒有內存關鍵字,Solidity會嘗試聲明變量存儲。 「你可以將存儲想象成一個具有虛擬結構的大型數組......一個在運行時不能改變的結構 - 它由合約中的狀態變量決定」。

也就是說,存儲的結構是在石頭在合同創建的基於您的合同級別的變量聲明的時間設置,不能由未來的方法調用進行更改。但是 - 該存儲的內容可以通過sendTransaction調用進行更改。這種調用改變了「狀態」,這就是合同級變量被稱爲「狀態變量」的原因。所以一個變量uint8 storagevar;在合同級別聲明的值可以更改爲uint8(0-255)的任何有效值,但類型爲uint8的值的「slot」將始終存在。

如果您在沒有內存關鍵字的函數中聲明變量,則solidity將嘗試使用當前編譯的存儲結構,但可能會產生意外的結果。 內存告訴可靠性在方法運行時爲變量創建一塊空間,保證其大小和結構以供將來在該方法中使用。

存儲器不能在合同級別被使用。只有在方法中。

the entry "What is the memory keyword? What does it do?"的常見問題。我在這裏引用它:

以太坊虛擬機有三個區域,它可以存儲項目。

第一個是「存儲」,其中所有合約狀態變量都存在。每個合同都有自己的存儲空間,它在函數調用之間是持久的,並且使用起來相當昂貴。

第二個是「內存」,這是用來保存臨時值。它在(外部)函數調用之間被擦除,使用起來更便宜。

第三個是堆棧,它用來保存小的局部變量。它幾乎可以自由使用,但只能保存有限的數值。

對於幾乎所有類型的,你不能指定他們應該被存儲在何處,因爲他們被複制使用它們每次。

在哪些類型的所謂的存儲位置是很重要的是結構和數組。如果你在函數調用中傳遞這些變量,如果它們可以保留在內存中或保留在存儲中,則不會複製它們的數據。這意味着您可以在被調用的函數中修改其內容,並且這些修改仍將在調用者中可見。

存在用於根據所述存儲位置上類型的變量它涉及的默認值:

  • 狀態變量總是在存儲
  • 函數參數總是在存儲器結構,陣列的
  • 局部變量或默認的映射類型參考存儲
  • 值類型的局部變量(即既不是陣列也不是結構也不映射)存儲在堆棧中
+0

你有解釋這個文件的任何鏈接嗎?我想多瞭解一下存儲的工作原理。 – Acapulco

+0

@Acapuclo它在常見問題解答「什麼是內存關鍵字?它有什麼作用?」 – bortzmeyer