memory 和 calldata 是两种数据位置(data location)关键字
特性memorycalldata存储位置内存(临时)调用数据(只读)是否可修改✅ 可改❌ 不可改使用场景函数内部变量external函数参数gas 成本较高更低示例。
·
在 Solidity 中,memory 和 calldata 是两种数据位置(data location)关键字,用来告诉编译器变量存储在哪里、如何传参、是否可修改。它们经常出现在函数参数和引用类型(如数组、结构体、字符串)中。
✅ 1. memory 是什么?
- 临时存储,函数执行完就销毁。
- 可读可写。
- 用于函数内部变量或函数参数(值类型不需要写,引用类型必须指定)。
示例:
function foo(string memory name) public pure returns (string memory) {
name = string(abi.encodePacked(name, "!"));
return name;
}
✅ 2. calldata 是什么?
- 只读,指向的是外部函数调用的输入数据。
- 不可修改,但更省 gas。
- 只能用于外部函数的参数(
external函数)。
示例:
function bar(string calldata name) external pure returns (string memory) {
// name 是只读的,不能修改
return string(abi.encodePacked(name, "!"));
}
🆚 对比总结
| 特性 | memory | calldata |
|---|---|---|
| 存储位置 | 内存(临时) | 调用数据(只读) |
| 是否可修改 | ✅ 可改 | ❌ 不可改 |
| 使用场景 | 函数内部变量 | external 函数参数 |
| gas 成本 | 较高 | 更低 |
| 示例 | string memory |
string calldata |
❗注意拼写:
你写的是 callded,正确的是 calldata(不是 callded)。
✅ 一句话记忆:
memory:临时读写,函数内用。calldata:只读省 gas,外部函数参数用。
更多推荐


所有评论(0)