Storage
作為局部變數的值類型(uint,bool等)最初設置為記憶體?
根據這個答案,它說像 bool、uint 等更簡單的變數在長度上不是可變的,因此預設為 memory,而這個提到
uint256 v;
的是預設為 storage 。所以我有點困惑函式中使用的原始類型(int,uint,bool)是否設置為記憶體或儲存作為其預設類型。我知道數組是預設儲存的,例如:uint256[] x
.任何人都可以澄清一下嗎?
根據開發 Solidity 文件,局部變數在函式範圍內的位置似乎確實是
storage
.但是,這似乎與將
pure
函式修飾符用作以下函式相矛盾:function check() public pure returns (uint256) { uint256 a = 2; return a; }
包含完全有效的語法。該關鍵字對不修改合約狀態或訪問它的
pure
函式有效,這意味著不可能引用變數。uint256 a``storage
為了驗證上述假設,我使用以下程式碼片段進行了測試:
儲存變數分配:
pragma solidity ^0.4.23; contract StorageVariableTest { uint256 k; function assignValue() public { k = 2; } }
局部函式變數賦值:
pragma solidity ^0.4.23; contract LocalVariableTest { function assignValue() public { uint256 k = 2; } }
在我的 Ganache 區塊鏈上測試這些功能顯示第二個合約片段的成本較低,這表明
uint256 k = 2
聲明從未儲存在合約的 storage/state中。因此,正確的解釋是只有明確聲明為
storage
或存在於函式範圍之外的變數實際上才是storage
variables。Gas 費用截圖: