Solidity Reserved

mem的0x00~0x80部分是Solidity的保留部分,如果要写内联汇编和普通代码混合的函数时要注意。

0x00~0x40 reserved for SHA3 calc (mapping/function hash/dynamic array)
          can be used between statements for short-term allocation
0x40~0x60 free memory pointer
0x60~0x80 initial value for dynamic memory array, should be zero permanently

Size Limit

理论上也是256bit寻址空间,但是实际上无法使用,因为每次mstore时,需要花费的gas fee与这次的最高地址和这次操作前的最高地址之间的差相关(也就是说实际上EVM行为是把0~最高地址的内存空间全部开辟出来了,参考这里),过高的地址会直接导致gas暴增,无法完成。

所以从此可以看出来mapping&动态数组是无法在memory上开辟的。

对齐

每个元素都会独占一个或多个完整slot,包括struct/array内的每一个元素,不会压缩。

数组

声明:address[4] memory a;

当前版本不在memory中存储长度,直接存储元素。(后续版本可能会修改)

(伪)动态数组

声明:address[] memory a = new address[](length);

数组长度必须在new时确定,后续不可修改,但是类型名不包含长度信息,可以通过a.length获取。

首slot存储length,随后紧跟元素。