其他分享
首页 > 其他分享> > solidity数据位置memory,storage,calldata解析

solidity数据位置memory,storage,calldata解析

作者:互联网

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