在以太坊Solidity中关键词memory
的含义或者说作用(purpose)是什么?
在查看智能合约时,有时数组arrays用memory
来声明,有时不是。有什么区别不同吗?
以太坊开发语言solidity中的memory
没有memory
这个关键字,solidity在存储storage
中声明变量。
领导Solidity开发的chriseth这么说:”你可以把存储storage
看作是一个大的数组,它有一个虚拟结构,一个在运行时不能改变的结构——它是由你的智能合约中的状态变量决定的”。
也就是说,在基于智能合约级别的变量声明在智能合约创建时,存储结构是在stone
中设置的,并且不能被将来的方法调用和更改。但是,存储的内容可以用state variables
调用来改变。这样的调用改变了state
,这就是为什么合约级变量被称为状态变量。因此,在合约级别声明的变量uint8
存储变量可以更改为uint8(0~255)的任何有效值,但是uint8类型的值的slot
槽位将始终存在。
如果在没有memory
关键字的函数中声明变量,那么solidity将尝试使用当前已经编译好的存储结构,但会产生意想不到的结果。memory
告诉solidity,以便在方法运行时为变量创建一块空间,保证其大小和结构,这样将来就可以在该方法中使用。
memory
不能在合约级别使用。只有方法中使用。
以太坊虚拟机存储
以太坊虚拟机有三个可以用来存储的区域:
- 1.第一个是
storage
存储,所有的智能合约状态变量都驻留在其中。每个合约都有自己的存储,它在函数调用之间是持久的,但使用起来相当昂贵。 - 2.第二个是
memory
内存,这是用来保存临时值的。它在(外部)函数调用后被清除,使用起来更便宜。 - 3.第三个是stack栈,用来保存小的局部变量。它几乎是免费使用的,但只能维护有限数量的值。
对于几乎所有类型,都不能指定它们存储的位置,因为它们每次使用时都会被复制。
所谓存储位置重要的类型是结构和数组。如果你在函数调用中传递这些变量,那么如果它们可以留在memory
内存中或留在storage
存储中,它们的数据就不会被复制。这意味着你可以通过调用函数中修改它们的内容,这些修改对调用方仍然可见。
存储位置的默认值取决于它关注的变量类型:
- 状态变量总是存储在
storage
中。 - 函数参数总是存储在
memory
中。 - 结构
struct
、数组array
或映射mapping
类型的局部变量默认引用存储在storage
。 - 在堆栈中只是存储值类型的局部变量(即,既不是
array
数组,也不是struct
结构也不是mapping
映射)。
原文:http://cw.hubwiz.com/card/c/ethereum-FAQ/1/1/2/
另外推荐一些之前的教程: