Solidity

始終對函式內創建的變數使用“記憶體”。不好的做法?

  • June 22, 2018

memory系統地將關鍵字用於在函式(建構子除外)中聲明的變數是不好的做法嗎?

明確使用memorystorage澄清變數是否包含指向記憶體或儲存的指針是一種很好的做法。

您不應該總是使用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 個元素)。在這種情況下,您應該聲明theChosenArraystorage指針,而不是memory指針。

引用自:https://ethereum.stackexchange.com/questions/51850