Memory(值传递

当引用类型作为方法参数时,它的类型默认为memory,写成string memory name = name;,或者var _name = name 效果都是一样的。

var声明一个变量时,这个变量的类型最终由赋给它值的类型决定。

联想

还记得mapping么?mapping不存储它们的key,通过计算出key的sha3值,把它存储在storage中。 任何查找mapping必须提供原始key或能够计算它。

memory的空间排布

Solidity 保留3个 256位的存储插槽。

  • 0 —— 64位:用于hash方法的临时空间
  • 64——96位:当前空闲memory 大小

临时空间也可用于存储状态声明。Solidity 会为 memory 存储开辟新存储空间,因为memory 不会被释放。

注意:这里说的是临时空间。

官方解释:Solidity中有一些操作需要大于64字节的memory,因此不适合临时空间。 它们将被放置在空闲内存的位置,但由于其生命周期较短,指针不会更新。 内存可能会或可能不会被清零。 正因为如此,开发者不应该期望内存自己会被清零。

所以建议读者还是按最坏的打算,能手动清零就手动清零。

技巧tips:

  • delete 数组元素
  • 变量手动置零
  • 在struct中使用较短的类型,并对它们进行排序,以便将短类型组合在一起。在虚拟机层,存储短类型的指令是SSTORE(gas消耗 5000 —— 20000),多个SSTORE操作会合并为一个。排序比如:uint128, uint128, uint256,而不是uint128, uint256, uint128。
  • 把合约中状态变量声明为public,这样自动生成getter
  • function 要有条件检查的话,使用modifier。实践证明gas消耗少。
  • 赋值初始化struct:x = MyStruct({a: 1, b: 2});

results matching ""

    No results matching ""