solidity数据位置
solidity一般有三种类型,memory,storage,calldata,一般只有外部函数的参数(不包括返回参数)被强制指定为calldata,这种数据位置是只读的,不会持久化到区块链。
memory与storage
- storage变量
- 永久存储在区块链中的变量,有点类似于全局变量
- 是在在函数变量之外声明的变量,同时被称为状态变量;此变量默认为storage类型,将永久写入区块链
- 能拿到的内容是引用/句柄/指针
- memory变量
- 是临时的,当外部函数对合约调用完毕以后,memory变量就会被移除,类似于局部变量
- 在函数内部声明的变量默认为memory类型,在函数调用结束后消失
- 拿到的是一份拷贝
总结
强制指定的数据位置:
- 外部函数的参数(不包括返回参数):calldata,效果与memory差不多
- 状态变量:storage
默认数据指定位置:
- 函数参数(包括返回参数):memory
- 所有其他局部变量的存储方式
其他位置:
- 映射只能存储在storage中
- 数组/结构体可以被声明为storage/memory