在以太固体中,关键字&Memory&Quot;的用途是什么? [英] In Ethereum Solidity, what is the purpose of the "memory" keyword?

查看:17
本文介绍了在以太固体中,关键字&Memory&Quot;的用途是什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

查看示例合同时,有时在方法中声明数组时带有"内存",有时则没有。有什么区别吗?

推荐答案

如果没有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",它用于保存临时值。它在(外部)函数调用之间被擦除,并且使用成本更低。

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

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

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

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

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

这篇关于在以太固体中,关键字&Memory&Quot;的用途是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆