Solidity
EVM 是否總是分配新記憶體,還是可以重用已分配但未使用的記憶體?
EVM 是否總是分配新記憶體,還是可以重用已分配但未使用的記憶體?
閱讀
delete
(http://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.
這是否意味著 if
a
是一個動態數組 (uint[]
),例如 lengthn
,然後delete a
分配給a
一個空數組:a = new uint[](0)
?不是長度為 的原始數組,n
其內容設置為0
?那麼,如果
new
和delete
在 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 作為一種合約語言感興趣。這裡有一些文件。