Solidity面试题更新 2026-08-05

请解释在 Solidity 智能合约中,数据位置 storage、memory 和 calldata 三者的区别是什么?

技术原理Solidity

考察说明

考查对 Solidity 数据存储位置及其生命周期、gas 消耗等核心概念的理解。

回答思路

  1. 【回答框架 1】storage 是持久化存储,数据保存在区块链上,状态变量默认使用 storage,修改会写入链上,gas 消耗高。
  2. 【回答框架 2】memory 是临时内存,函数调用期间存在,用于局部变量和参数,修改不会上链,gas 消耗较低。
  3. 【回答框架 3】calldata 是只读的调用数据,用于外部函数参数,不可修改,比 memory 更节省 gas,适合大型数据如数组。
  4. 【回答框架 4】存储位置可以显式指定,例如函数参数用 memory 或 calldata,状态变量只能用 storage。数据复制规则不同:storage 到 memory 是复制,memory 到 storage 也是复制,而 storage 到 storage 是引用。
  5. 【回答框架 5】理解这些区别有助于优化 gas 成本和避免数据持久化意外。
  6. 【关键点 1】storage 持久化、mutation 上链,gas 高;memory 临时、可修改;calldata 只读、不可修改。
  7. 【关键点 2】calldata 比 memory 更省 gas,适合外部函数的大数组参数。
  8. 【关键点 3】状态变量默认 storage,函数参数默认 memory(外部函数可用 calldata)。
  9. 【关键点 4】存储位置间的赋值复制或引用规则影响数据修改结果。
  10. 【易错点 1】误以为 memory 变量修改会影响原始 storage 数据(除非是引用赋值,需明确拷贝/引用关系)。
  11. 【易错点 2】对 calldata 进行修改操作会导致编译错误。