Solidity中的数据存储位置
你会发现这块内容是最具有挑战性的。下面的表格会是每块数据存储位置的概览,标识了读写的权限。具体每个数据存储位置的详情,可以阅读对应的具体模块。
数据读写权限
我们什么时候使用关键字, storage、memory、calldata ?
任何具有复杂类型的变量比如array,struct,mappings或者enum必须指定一个数据存储位置。
Storage
Storage对应合约内的存储。
你可以把你不想被cloned的变量作为Storage存储。
Storage是长期有效的,但是成本比较高。
Memory
在ETH中memory保存了临时变量,就像函数的参数。
而且,memory变量在外部函数调用时会被清除。
Memory是短暂其便宜的!
Calldata
calldata几乎是免费的,但是有一个长度的限制。
Stack
stack存储了小的局部变量。然而它只能存储数量有限的变量。stack在eth中只能有最大1024个元素。
一旦函数执行完成就结束。
函数参数的数据存储位置规则
下面的表格展示了函数参数可选的数据类型,取决于函数的可见性。
外部函数或者公有函数不能访问storage
函数内部的数据存储位置
在函数内部所有的三种数据存储位置都能被指定,不管函数的可见性。然后在在赋值的时候存在一些具体的规则,如下面表格中展示:
Storage
| storage references can be assigned a: | |
|---|---|
| state variable directly | ✅ |

本文详细介绍了Solidity中数据存储的四个位置:Storage、Memory、Calldata和Stack,强调了它们的读写权限、生命周期及成本。Storage用于长期存储合约数据,Memory用于临时变量,Calldata在函数调用时使用且成本低,Stack则存储少量局部变量。文章通过合约示例和函数参数规则,帮助开发者理解如何选择合适的数据存储位置。

1524

被折叠的 条评论
为什么被折叠?



