Q10 · 智能合约与 Solidity

Solidity 里 memory 和 storage 的区别?

SoliditymemorystorageGas

⚡ 速记答案(30 秒)

  • storage:链上持久存储,状态变量默认在这里;读写 Gas 昂贵
  • memory:函数执行期间的临时内存,类似栈/堆内存,不上链,成本相对低
  • 引用类型在函数形参/局部变量上要显式声明 memorystorage,注意拷贝 vs 引用语义

📖 详细讲解

数据位置对比


位置生命周期Gas 成本用途
storage永久状态变量
memory函数执行期间临时变量
calldata函数执行期间最低外部函数参数(只读)

Gas 成本示例


SSTORE (存储写入): 20,000 gas (新值) / 5,000 gas (修改)
SLOAD (存储读取): 2,100 gas
MSTORE (内存写入): 3 gas
MLOAD (内存读取): 3 gas

面试要点


• 什么时候用 memory,什么时候用 storage

• 引用类型的赋值语义

• calldata 的只读特性和 Gas 优化

💻 代码示例

storage vs memory 示例
contract DataLocation {
    uint256[] public numbers;

    // storage 引用:修改会影响状态变量
    function modifyStorage() public {
        uint256[] storage nums = numbers;
        nums.push(1); // numbers 也会被修改
    }

    // memory 拷贝:修改不影响状态变量
    function modifyMemory() public view returns (uint256[] memory) {
        uint256[] memory nums = numbers;
        // nums[0] = 999; // 只修改内存副本
        return nums;
    }

    // calldata:只读,最省 Gas
    function processCalldata(uint256[] calldata data) external pure returns (uint256) {
        return data.length;
    }
}
💡
面试技巧:回答时先给出核心结论,再展开细节。如果有实际项目经验,一定要结合具体案例说明。