solidity数据位置memory,storage,calldata解析
solidity中数据位置分为:memory,storage,calldata
目前,引用类型包括struct(结构体)、array(数组)和mapping(映射),使用引用类型必须明确地提供存储该类型的数据位置(memory、storage或calldata):
memory(生存期存在于function(函数)内,超过作用域即失效);
storage(生存期同contract(合约)一致,状态变量强制为storage);
calldata(不可修改、非持久的函数参数存储区域,用于存储函数参数,只读,不会永久存储一个数据位置,external function(外部函数)的传入参数(不包括返回参数)强制为calldata,效果类似memory);
pragma solidity ^0.8.4; contract example{ struct exam{ bytes32 name; uint deposit; }//仅作示例,数据类型为storage address payable public beneficiary;//状态变量,仅作示例,数据类型为storage uint public time;//状态变量,仅作示例,数据类型为storage bool public ended;//状态变量,仅作示例,数据类型为storage //values由于是external function()的传入参数,强制设为calldata类型 function reveal(uint[] calldata values) external returns(uint){ uint length = values.length;//length默认为memory类型 return values[length-1];//返回最后一个值 } }
Note1:尽量使用calldata作为数据位置,因为可以避免被复制,且不能修改数据。用calldata修饰array(数组)和struct(结构)也可以作为函数返回值,但无法给其分配空间。
Note2:0.6.9版本之前的数据存储位置定义为:calldata用于external function(外部函数),memory用于public function(公开函数),memory和storage均可用于internal function(内部函数)和private function(私有函数)。当前0.8.0.版本允许memory和calldata用于所有函数类型。
Note3:在版本0.5.0之前,数据位置可省略,并且根据变量的类型,函数类型等有默认数据位置,但是所有复杂类型现在必须提供明确的数据位置。
来源(solidity英文官方文档0.8.13):https://docs.soliditylang.org/en/v0.8.13/types.html#data-location
附(solidity中文官方文档0.8.0):https://learnblockchain.cn/docs/solidity/types.html#data-location