【问题标题】:Solidity memory in a function函数中的 Solidity 记忆
【发布时间】:2022-12-17 09:40:18
【问题描述】:

嗨,我是 solidity 的新手,我想知道为什么我们在声明函数时使用关键字 memory,如果我们选择不使用它会怎样?例如

function createObject(string _name, uint _dna) public {
    object.push(Object(_name, _dna));
}

代替

function createObject(string memory _name, uint _dna) public {
    object.push(Object(_name, _dna));

【问题讨论】:

    标签: solidity


    【解决方案1】:

    不写很容易报错

    如果没有 memory 关键字,Solidity 会尝试在存储中声明变量。

    与 RAM 非常相似,Solidity 中的 Memory 是存储数据的临时位置,而 Storage 在函数调用之间保存数据。 Solidity 智能合约在执行期间可以使用任意数量的内存,但一旦执行停止,内存将被完全擦除以供下一次执行。另一方面,存储是持久的,智能合约的每次执行都可以访问以前存储在存储区域中的数据。

    也就是说,存储结构在基于您的合约级变量声明创建合约时是固定不变的,并且不能被未来的方法调用更改。但是——可以使用 sendTransaction 调用更改该存储的内容。这样的调用会改变“状态”,这就是合约级变量被称为“状态变量”的原因。所以一个变量 uint8 storagevar;在合约级别声明的可以更改为 uint8 (0-255) 的任何有效值,但 uint8 类型值的“插槽”将始终存在。

    如果你在函数中声明变量时没有使用 memory 关键字,那么 solidity 将尝试使用当前编译的存储结构,但会产生意想不到的结果。 memory 告诉 solidity 在方法运行时为变量创建一块空间,保证它的大小和结构以供将来在该方法中使用。

    合同级别不能使用内存。仅在方法上。

    【讨论】:

    • 为什么第二个参数 uint _dna 不必用 memory 关键字修饰?
    • @TylerXue 因为内存只需要用于复杂类型,即并不总是适合 256 位并且必须更小心处理的类型
    【解决方案2】:

    memory 关键字告诉 Solidity 将参数存储在特定位置,这允许您在函数本身内部更改该参数。很像RAM。

    Calldata 相同,但参数不可变。如果您不打算更改函数内部的参数,最好使用它,因为它更高效。

    Storage 告诉 Solidity 该值处于智能合约的状态。如果参数确实在状态中,它也比 memory 更有效。

    您可以通过the difference between these 3 keywords in this article获取更多信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-02
      • 2012-11-26
      • 2020-11-07
      • 2023-01-27
      • 1970-01-01
      • 1970-01-01
      • 2010-12-04
      • 2013-08-20
      相关资源
      最近更新 更多