且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

在以太固体中,关键字&Memory&Quot;的用途是什么?

更新时间:2022-12-16 08:35:57

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

Lead Solidity Dev chriseth:您可以将存储视为具有虚拟结构…的大型阵列一种不能在运行时更改的结构--它由合同中的状态变量决定。

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

如果在函数中声明变量时不使用Memory关键字,那么Solidity将尝试使用当前正在编译的存储结构,但可能会产生意外的结果。内存通知实体在方法运行时为变量创建一块空间,以保证其大小和结构供将来在该方法中使用。

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

参见常见问题解答中的the entry "What is the memory keyword? What does it do?"。我在这里引用它:

以太虚拟机有三个可以存储项目的区域。

第一个是"存储",所有契约状态变量都驻留在其中。每个协定都有自己的存储空间,并且在函数调用之间是持久的,使用起来相当昂贵。

第二个是"Memory",它用于保存临时值。它在(外部)函数调用之间被擦除,并且使用成本更低。

第三个是堆栈,它用来保存小的局部变量。它几乎可以免费使用,但只能容纳有限数量的值。

对于几乎所有类型,您不能指定它们应该存储在哪里,因为每次使用它们时都会复制它们。

所谓的存储位置很重要的类型是结构和数组。例如,如果你在函数调用中传递这样的变量,如果它们的数据可以留在内存中或存储中,则不会复制它们的数据。这意味着您可以在被调用的函数中修改它们的内容,并且这些修改在调用方中仍然可见。

根据所涉及的变量类型,存储位置有缺省值:

  • 状态变量始终存储在存储器中
  • 函数参数始终在内存中
  • 默认情况下结构、数组或映射类型引用存储的局部变量
  • 值类型(即既不是数组,也不是结构,也不是映射)的局部变量存储在堆栈中