简单粗暴区分Solidity的calldata和memory

最近回顾了很多基础知识,发现很多文章都是谷歌翻译过来,又拖沓讲得又不够清楚,于是决定自己用简单的例子概括。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//SPDX-License-Identifier: Unlicense
pragma solidity 0.8.0;

contract Difference{

string public name;

//memory可以用于任何函数的声明参数
//返回值可以用memory,但不能用calldata
function useMemory(string memory _in)internal returns(string memory){
name = _in;

//memory是可临时改变的
_in = name;

return name;
}

//calldata只能用于external函数的声明参数
//返回值可以用memory,但不能用calldata
//calldata是最便宜的存储位置,花费gas最少
function useCalldata(string calldata _in)external returns(string memory){
name = _in;

//calldata是不能临时改变的
//_in = name; 就会报错
return name;
}
}

总结

calldata是memory的低配版,降低了gas花费,因此在使用上相对受限。


简单粗暴区分Solidity的calldata和memory
http://nangbowan.github.io/2022/11/01/简单粗暴区分Solidity的calldata和memory/
作者
Science_Jun
发布于
2022年11月1日
许可协议