Solidity
始終對函式內創建的變數使用“記憶體”。不好的做法?
memory
系統地將關鍵字用於在函式(建構子除外)中聲明的變數是不好的做法嗎?
明確使用
memory
或storage
澄清變數是否包含指向記憶體或儲存的指針是一種很好的做法。您不應該總是使用
memory
關鍵字,因為它可能會使您的程式碼非常低效:當您將數組從儲存分配給memory
指針變數時,整個數組將從儲存中讀取並複製到記憶體中。這是您不應該使用的情況範例
memory
:contract Test { uint256[1000] lotsOfNumbersInStorage; uint256[1000] moreNumbersInStorage; function calculateSomething(uint256 a) public view returns(uint256) { uint256[1000] memory theChosenArray; if (a > 0) theChosenArray = lotsOfNumbersInStorage; else theChosenArray = moreNumbersInStorage; return theChosenArray[3] * theChosenArray[a]; } }
這些分配
theChosenArray
看起來很無辜,但它們會將整個數組從儲存複製到記憶體中,這將花費至少 200000 gas(每次儲存讀取 200 gas * 1000 個元素)。在這種情況下,您應該聲明theChosenArray
為storage
指針,而不是memory
指針。