内存扩展优化
Solidity 总是通过扩展内存来写入内存,这有时效率不高。我们可以利用内联汇编来优化对 96 字节或更小数据的内存操作。
Solidity 保留其前 64 个字节内存(mem[0x00:0x40])作为临时空间,开发人员可以使用它来执行任何操作,并保证它不会被意外覆盖或读取。接下来的 32 个字节内存(mem[0x40:0x60])是 Solidity 存储、读取和更新空闲内存指针的地方。这就是 Solidity 跟踪下一个要写入新数据的内存偏移量的方式。接下来的 32 个字节内存(mem[0x60:0x80])称为零槽。它是未初始化的动态内存数据(字节内存、字符串内存、T[]内存(其中 T 是任何有效类型))指向的位置。由于这些值未初始化,因此 Solidity 会推进它们指向的槽 (0x60) 保持为 0x00。
注意,存储在内存中的结构体即使是动态的(即其自身具有动态值),在未初始化时也不会指向零槽。注意:即使未初始化的动态内存数据嵌套在结构体中,它们仍然指向零槽。如果我们能够利用临时空间执行内存操作(编译器通常会自行扩展内存来执行这些操作),那么我们就可以优化代码。这样一来,我们现在就有 64 字节更便宜的内存可供使用。空闲的内存指针空间也可以使用,只要我们在退出汇编代码块之前更新它即可。为此,我们可以将其临时存储在堆栈中。
对应源码
本文配套代码固定到提交
8960383;Gas 数据会随编译器、优化器参数和 EVM 版本变化。