在 Solidity 中,memorycalldata 是两种数据位置(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,外部函数参数用。
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐