Q10 · 智能合约与 Solidity
Solidity 里 memory 和 storage 的区别?
⚡ 速记答案(30 秒)
storage:链上持久存储,状态变量默认在这里;读写 Gas 昂贵memory:函数执行期间的临时内存,类似栈/堆内存,不上链,成本相对低- 引用类型在函数形参/局部变量上要显式声明
memory或storage,注意拷贝 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;
}
}面试技巧:回答时先给出核心结论,再展开细节。如果有实际项目经验,一定要结合具体案例说明。