引用类型在Solidity中有一个额外的属性,数据的存储位置。可选为memory和storage。
memory:存储位置同我们普通程序的内存一致。即分配,即使用,越过作用域即不可被访问,等待被回收。
storage:这种类型了,一旦使用这个类型,数据将永远存在。
calldata:它存储的是函数参数,是只读的,不会永久存储的一个数据位置。外部函数的参数(不包括返回参数)被强制指定为calldata。效果与memory差不多。
强制的数据位置
外部函数(External function)的参数(不包括返回参数)强制为:calldata
状态变量:强制为: storage
pragma solidity ^0.4.0;
contract StateVariable{
struct S{string a;uint b;}
//状态变量,默认是storage
S s;
}
默认数据位置
函数参数,返回参数:memory
局部变量:storage
pragma solidity ^0.4.0;
contract SimpleAssign{
struct S{string a;uint b;}
function assign(S s) internal{ //默认参数是memory
//默认的变量是storage的指针
//S tmp = s; 报错
}
}
这里将一个memory类型的参数赋值给storage类型的局部变量会报错
转换问题:
1

本文介绍了Solidity中的数据位置概念,包括强制数据位置、默认数据位置以及转换问题。memory用于临时存储,作用域结束后数据会被回收;storage用于持久存储,数据会一直存在;calldata用于外部函数只读参数。在不同数据位置间进行转换时,如storage到memory是拷贝,而memory到storage则会根据具体情况采取值传递或报错。
最低0.47元/天 解锁文章
1万+

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



