从本章开始,我们来研究内存布局。
在你做以下操作时将使用到内存:
free
命令。mload
, mstore
, mstore8
, msize
mstore(p, v)
将值 v
存储到内存地址 p
开始的“内存槽”中(以后文章中“内存槽”指的是从该地址开始的 32 字节区域)。mload(p)
是从内存槽 p[p..0x20]
中获取 32 字节的数据。mstore8(p, v)
仅将 1 字节的数据存储到地址 p
中。msize()
返回当前事务中最大的可访问内存索引。比如,我想将32字节的 0xff...fff 存储到内存槽 0x00 中,将得到以下的结果,可以看到地址0x00 - 0x19
都填了ff
。
需要注意的是,内存的最小单位是 1 字节,这与存储槽不同。因此,如果将数据存储在内存槽 0x01 中,可以看到地址0x01 - 0x20
都填了ff
。
如果存储的数据较小,例如 mstore(0x00, 7)
,首先会将 7 扩展为 32 字节,即 mstore(0x00, 0x000...0007)
,结果如下:
而使用 mstore8(0x00, 0x7)
时,则只会在地址 0x00
处存入 1 字节的值:
总结 今天,我们对内存简单的开个头,下一讲我们将讲解 Solidity 是如何使用内存的。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!