Solidity入门学习笔记1-引用类型-数据位置

本文详细介绍了Solidity中memory和storage两种数据位置的区别与使用场景。状态变量强制存储在storage,而函数参数和返回值使用memory。在存储大容量数据时,需要考虑存储开销。状态变量与局部变量之间的赋值实际上是引用,改变一方会影响另一方。调用函数时,可以传递对状态变量的引用或在内存中创建独立拷贝。理解这些概念对于编写高效且节省 gas 的智能合约至关重要。
摘要由CSDN通过智能技术生成

摘自:https://solidity-cn.readthedocs.io/zh/develop/types.html?highlight=storage#index-14

对于占位空间超过256位类型,需要慎重,否则存贮开销较大,因此需要考虑是存储在memory(临时存贮)还是storage(存储状态变量的地方)中;

所有复杂类型(数组、结构)都有一个额外属性“数据位置”,storage/memory;

函数参数、返回值均为memory;

局部变量默认位置为storage;

状态变量的位置强制为storage;

calldata是一块只读的、不会永久存贮的位置,用来存储函数参数。外部函数的参数(非返回值)被强制设置为calldata,效果类似memory;

状态变量赋值局部变量时仅传递一个引用,因此状态变量改变,局部变量同时改变;

从一个memory引用类型向另一个memory引用类型赋值并不会创建拷贝;

pragma solidity ^0.4.0;

contract C {
    uint[] x; // x 的数据存储位置是 storage

    // memoryArray 的数据存储位置是 memory
    function f(uint[] memoryArray) public {
        x = memoryArray; // 将整个数组拷贝到 storage 中,可行
        var y = x;  // 分配一个指针(其中 y 的数据存储位置是 storage),可行
        y[7]; // 返回第 8 个元素,可行
        y.length = 2; // 通过 y 修改 x,可行
        delete x; // 清除数组,同时修改 y,可行
        // 下面的就不可行了;需要在 storage 中创建新的未命名的临时数组, /
        // 但 storage 是“静态”分配的:
        // y = memoryArray;
        // 下面这一行也不可行,因为这会“重置”指针,
        // 但并没有可以让它指向的合适的存储位置。
        // delete y;

        g(x); // 调用 g 函数,同时移交对 x 的引用
        h(x); // 调用 h 函数,同时在 memory 中创建一个独立的临时拷贝
    }

    function g(uint[] storage storageArray) internal {}
    function h(uint[] memoryArray) public {}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值