MetaNode社区
找工作面试题库领SepoliaETH

© 2025 MetaNode社区. All rights reserved.

Powered by MetaNode

VIP

尊享永久会员

解锁所有面试题解,一次性买断

当前等级普通用户
限时优惠
¥129¥399

/永久

✓解锁全部企业高频面试题及高质量题解
✓参与模拟面试,获取百套模拟面试视频
✓加入永久会员交流群,专属答疑

点击按钮联系客服获取兑换码

扫码添加老师微信

获取兑换码 · 干货不错过

微信二维码
Logo

关注我们

B站抖音小红书
create 和 create2 之间有什么区别?私有、内部、公共和外部函数之间的区别?Solidity的数据存储位置有哪些修饰符?为什么 AAVE 不需要抵押任何资产就能借钱?智能合约大小大约可以有多大?
返回题库

Solidity的数据存储位置有哪些修饰符?

简单
00

Solidity 中的数据存储位置(Data Location)主要有 三个关键修饰符:

✅ Solidity 的三种数据存储修饰符

修饰符存储位置特点使用场景
storage链上持久化存储(State Storage)成本高、持久保存、所有合约共享同一份状态状态变量、结构体引用、映射、数组等
memory内存区(函数执行期间存在)成本中等、临时的、函数结束即销毁函数内部变量、临时数组、字符串处理
calldata只读、不可修改、存在于外部调用数据中Gas 成本最低(特别是数组/字符串)、只读函数参数(external),节省 Gas

🔍 1. storage

链上持久化存储,Gas 最贵。

SOLIDITY
1uint[] public arr; // storage 2 3function f() public { 4 uint[] storage ref = arr; // 引用状态变量 5 ref.push(1); 6}
  • 修改 storage 会写入链上 → 费用高
  • 引用类型(数组、struct、mapping)默认如果是状态变量就是 storage

🔍 2. memory

临时存储,只在函数执行期间存在。

SOLIDITY
1function f(uint[] memory values) public pure { 2 values[0] = 123; // 可读可写,但不会写入链上 3}
  • 默认用于非 storage 的引用类型本地变量
  • 执行完函数自动销毁

🔍 3. calldata

只读、不可修改,外部调用参数所在位置,最省 Gas。

SOLIDITY
1function f(uint[] calldata values) external { 2 uint v = values[0]; // 只读 3}

优点:

  • 不需要复制到 memory(节省大量 Gas)
  • 参数直接在调用数据中读取
  • 最适合 external + 数组/字符串参数

📌 对比总结

项目storagememorycalldata
生命周期永久函数执行期函数调用期
可写✔✔✖
Gas 成本💰💰💰(最高)💰💰💰(最低)
典型使用状态变量、修改链上数据本地变量、纯函数处理external 函数的数组/字符串参数

📘 Bonus:什么时候用哪个?

✔ 如果参数是数组或 struct,且函数是 external → 用 calldata

SOLIDITY
1function process(uint[] calldata arr) external { 2 ... 3}

✔ 如果是函数内部需要修改的临时变量 → memory

✔ 如果要改变链上状态 → storage