标签:calldata function 函数 solidity storage memory
solidity中数据位置分为:memory,storage,calldata
目前,引用类型包括struct(结构体)、array(数组)和mapping(映射),使用引用类型必须明确地提供存储该类型的数据位置:
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 function reveal(uint[] calldata values) external returns(uint){ uint length = values.length; 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
标签:calldata,function,函数,solidity,storage,memory 来源: https://www.cnblogs.com/forkroad/p/16073532.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。