solidity 中数据位置,即说明数据存储在哪里,solidity有3个位置
1 memory (内存)即数据在内存中,因此数据仅在其生命周期内(函数调用期间)有效,不能用于外部调用
2 storage (链上存储空间),就是状态变量保存的位置,只要合约存在就一直存储
3 callData (调用数据),一个特殊只读数据位置,用来保存函数调用参数(0.6.9 之前 calldata 仅用于外部函数调用参数,0.6.9之后可用于任意函数。)
更改数据位置或类型转换将始终产生自动进行一份拷贝,而在同一数据位置内(对于 存储storage 来说)的复制仅在某些情况下进行拷贝。
从storage 移动到memory,从memory 移动到storage是需要复制的,由于是从暂存空间移动到储存空间,因此必然会复制一份
在solidity 中使用引用类型的时候,必须指定数据的位置。
所有的引用类型,如数组和结构体类型,都有一个额外注解 数据位置。来说明数据存储位置。
使用 calldata 变量的好处是,它不用将 calldata 数据的副本保存到内存中,并确保不会修改数组或结构(calldata 位置是只读的),因此,如果可以的话,请尽量使用 calldata作为数据位置
函数的返回值中其实也可以使用 calldata数据位置,但是无法给其分配空间。