内存中的布局

solidity保留四个32字节的插槽,具体的字节范围(包括端点)使用如下:

  • 0x00 - 0x3f (64字节):哈希方法的临时空间

  • 0x40 - 0x5f (32字节):当前分配的内存大小(aka.可用内存指针)

  • 0x60 - 0x7f (32字节):零插槽

可以在语句之间使用草稿空间(即在内联程序集中)。零槽用作动态内存数组的初始值,不应写入(空闲内存指针指向 0x80 最初)。

solidity总是将新对象放在空闲内存指针上,而内存永远不会被释放(这在将来可能会改变)。

坚固的存储器阵列中的元件总是占用32字节的倍数(甚至对于 bytes1[] ,但不是为了 bytesstring )。多维存储器阵列是指向存储器阵列的指针。动态数组的长度存储在数组的第一个槽中,后跟数组元素。

警告

Solidity中有一些操作需要大于64字节的临时内存区域,因此无法放入暂存空间。它们将被放置在空闲内存指向的位置,但是由于它们的生存期很短,指针不会被更新。内存可能会被清零,也可能不会被清零。因此,我们不应该期望空闲内存指向清零内存。

虽然使用它似乎是个好主意 msize 为了到达一个绝对归零的内存区域,在不更新空闲内存指针的情况下非临时使用这样的指针可能会产生意外的结果。

与存储中的布局不同

如上所述,存储器中的布局不同于 storage 。下面是一些例子。

数组差异的示例

以下数组在存储中占用32字节(1个槽),但在内存中占用128字节(4个项目,每个项目32个字节)。

uint8[4] a;

结构布局差异的示例

下面的结构占用了96个字节(3个32字节的插槽)的存储空间,但是占用了128个字节的内存空间(4个项目,每个项目32个字节)。

struct S {
    uint a;
    uint b;
    uint8 c;
    uint8 d;
}