Solidity

EVM 是否總是分配新記憶體,還是可以重用已分配但未使用的記憶體?

  • November 30, 2017

EVM 是否總是分配新記憶體,還是可以重用已分配但未使用的記憶體?

閱讀deletehttp://solidity.readthedocs.io/en/develop/types.html)的文件,提到:

delete a assigns the initial value for the type to a. I.e. for integers it is equivalent to a = 0, but it can also be used on arrays, where it assigns a dynamic array of length zero or a static array of the same length with all elements reset. For structs, it assigns a struct with all members reset.

這是否意味著 ifa是一個動態數組 ( uint[]),例如 length n,然後delete a分配給a一個空數組:a = new uint[](0)?不是長度為 的原始數組,n其內容設置為0?

那麼,如果newdelete在 Solidity 合約中多次使用,EVM 會繼續分配新記憶體(擴展記憶體),還是會盡可能重用已分配的記憶體?

考慮循環:

uint[] a;
for (uint i = 0; i < 1000; ++i) {
  a = new uint[](100);
  delete a;
}

這會分配 100 或 100000 個記憶體單元嗎?

這是一個有趣的問題,所以我寫了一些快速程式碼來測試它。

contract Memsize {
   function foo(uint _its) pure public returns (uint) {
       uint ms;
       uint[] memory a;
       for (uint i = 0; i < _its; ++i) {
           a = new uint[](100);
           delete a;
       }
       assembly{
           ms := msize()
       }
       return(ms);
   }
}

結果;

foo(1) 3392
foo(2) 6656
foo(3) 9920

等等。所以,Solidity 不會重複使用記憶體,並且每次都會重新分配記憶體。

這不是 EVM 的限制。沒有理由不能重新使用記憶體。它是 Solidity 編譯器的一個屬性。

如果你真的關心這些東西(智能合約的效率優化),那麼你可能會對 LLL 作為一種合約語言感興趣。這裡有一些文件。

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