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
理论上也是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,随后紧跟元素。