Solidity中的数据存储位置

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

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值