3、数据类型中的数据位置,stograge、memory、calldata

news/2024/5/21 13:48:47/文章来源:https://www.cnblogs.com/shyroke/p/16754498.html

数据位置

所有的复杂类型,即 数组 和 结构 类型,都有一个额外属性,“数据位置”,说明数据是保存在 内存memory 中还是 存储storage 中。 根据上下文不同,大多数时候数据有默认的位置,但也可以通过在类型名后增加关键字 storage 或 memory 进行修改。 函数参数(包括返回的参数)的数据位置默认是 memory, 局部变量的数据位置默认是 storage,状态变量的数据位置强制是 storage (这是显而易见的)。

也存在第三种数据位置, calldata ,这是一块只读的,且不会永久存储的位置,用来存储函数参数。 外部函数的参数(非返回参数)的数据位置被强制指定为 calldata ,效果跟 memory 差不多。

数据位置的指定非常重要,因为它们影响着赋值行为: 在 存储storage 和 内存memory 之间两两赋值,或者 存储storage 向状态变量(甚至是从其它状态变量)赋值都会创建一份独立的拷贝。 然而状态变量向局部变量赋值时仅仅传递一个引用,而且这个引用总是指向状态变量,因此后者改变的同时前者也会发生改变。 另一方面,从一个 内存memory 存储的引用类型向另一个 内存memory 存储的引用类型赋值并不会创建拷贝。

复制代码
pragma solidity ^0.4.0;contract C {uint[] x; // x 的数据存储位置是 storage// memoryArray 的数据存储位置是 memoryfunction 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 {}
}
复制代码

  总结

强制指定的数据位置:
  • 外部函数的参数(不包括返回参数): calldata
  • 状态变量: storage
默认数据位置:
  • 函数参数(包括返回参数): memory
  • 所有其它局部变量: storage

深入分析

storage 存储结构是在合约创建的时候就确定好了的,它取决于合约所声明状态变量。但是内容可以被(交易)调用改变。

Solidity 称这个为状态改变,这也是合约级变量称为状态变量的原因。也可以更好的理解为什么状态变量都是storage存储。

memory 只能用于函数内部,memory 声明用来告知EVM在运行时创建一块(固定大小)内存区域给变量使用。

storage 在区块链中是用key/value的形式存储,而memory则表现为字节数组

关于栈(stack)

EVM是一个基于栈的语言,栈实际是在内存(memory)的一个数据结构,每个栈元素占为256位,栈最大长度为1024。 值类型的局部变量是存储在栈上。

不同存储的消耗(gas消耗)

  • storage 会永久保存合约状态变量,开销最大

  • memory 仅保存临时变量,函数调用之后释放,开销很小

  • stack 保存很小的局部变量,几乎免费使用,但有数量限制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_395718.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Day11 栈和队列

150. 逆波兰表达式求值 解法一:将计算部分抽象成一个函数,使代码更加简洁,避免了很多冗余操作。对比下面解法二(我自己写的),此解法(参考别人的)的代码更加精简。核心思想都是利用栈…

Linux学习 -- Shell面试题练习

1、使用Linux命令查询file1中空行所在的行号 awk /^$/ {print NR} file1 // 使用正则表达式^$ 来表示空行 2、使用Linux命令计算文件a.txt的第二列的和并输出 张三 40 李四 50 王五20 cat a.txt | awk -F " " {sum$2} END {print sum} 3、Shell脚本中如何检查一个文…

欧拉函数的power

在算数基本定理中有 $ N = p_{1}^{a1} p_{2}^{a2} p_{3}^{a3} ..... p_{k}^{ak} $ wuw在y总的课中是用了容斥原理进行推导得到了 $ \phi(x) = N * (1 - \frac{1}{p1}) * (1 - \frac{1}{p2}) * .... * ( 1 - \frac{1}{pk}) $ 所以就可以得到依靠该公式得出的欧拉公式的算法 #in…

基本语法

输入输出输入: 输出:字符串: System.out.println("hello world!"); 字符串+数值 System.out.println("a =" + 8);import java.util.Scanner; //Scanner 是一个简单的文本扫描器public class MyInput {public static void main(String[] Args) {Scanne…

cat笔记

0.学习目标 能够知道什么是CAT能够搭建CAT服务端环境能够进行CAT客户端的集成能够使用CAT监控界面进行服务监控能够完成CAT和常用框架集成了解CAT告警配置了解CAT客户端和服务端原理 1.CAT入门 在这一部分我们主要介绍以下3部分内容: 什么是调用链监控 什么是CA…

【虚幻引擎UE】UE5 阴影异常与优化解决方案合集

一、消除阴影锯齿 异常效果: 模型锯齿状阴影。 解决方案: ① 确定打开虚拟阴影贴图。 虚拟阴影贴图(VSM)是一种全新的阴影贴图方法,可以提供稳定的高分辨率阴影。通过与虚幻引擎5的Nanite虚拟几何体、Lumen全局光照和…

Seata安装

文章目录一、下载二、MySQL配置三、Nacos配置四、启动参考一、下载 从Seata下载地址下载 https://github.com/seata/seata/releases 这里下载的是seata-server-1.5.2.tar.gz 解压: tar -xvf seata-server-1.5.2.tar.gz修改配置:conf/application.ym…

Python实战——全球疫情数据采集, 并做可视化

前言 大家早好、午好、晚好吖~ 知识点: 爬虫基本流程 requests 发送请求 re 正则表达式 json 结构化数据解析 开发环境: python 3.8: 解释器 pycharm: 代码编辑器 requests 发送请求 pyecharts 绘制图表 pandas 读取数据 基本原理: 模拟成 浏览器/客户端 向 服务器…

React-Hooks源码深度解读

useState 解析 useState 使用 通常我们这样来使用 useState 方法 function App() {const [num, setNum] useState(0);const add () > {setNum(num 1);};return (<div><p>数字: {num}</p><button onClick{add}> 1 </button></div>…

I2C 时序、速率计算及intel I2C驱动

目录 速率 信号 时序定义 START ACK NACK STOP 时序实战 速率计算 数据解读 异常时序 上拉电阻 I2C的设备驱动 速率 主要支持的速率如下&#xff1a; 100Kbps 400Kbps 1Mbps 3.4Mbps 信号 SDA 数据 SCL 时钟 时序定义 START SCL为高电平时&#xff0c;SD…

【FineReport企业日常问题 1.0】帆软决策服务端管理员密码忘记怎么办?

文章目录企业问题描述分析问题加密方式分类原理问题解决企业问题描述 有的时候我们在进行帆软部署的时候&#xff0c;设置管理密码的不小心忘记(当然这个是属于小概率事件) 其实是有相应的办法解决的~ 分析问题 首先&#xff0c;我们来了解一下帆软的加密算法 加密方式分类…

Angr学习 00_angr_find

Angr学习 00_angr_find1. github下载angr项目2. angr安装3. IDA静态分析4. angr使用说明5. exp6.运行结果1. github下载angr项目 点击前往github 2. angr安装 网上的教程都是要安装什么虚拟环境我也安装了但是可能因为我是初学者不知道这个虚拟环境有什么用我直接在shell中用…

grpc介绍(二)——认证方式

前言 HTTP是明文传输的&#xff0c;即客户端与服务端之间通信的信息是可见的&#xff0c;这就存在被窃听、冒充或篡改的风险。HTTPS在HTTP和TCP之间加入了TLS协议&#xff0c;如图所示&#xff1a; TLS协议主要解决了以下三个网络安全问题&#xff1a; 信息加密&#xff1a; …

cannot import name ‘TimedJSONWebSignatureSerializer‘ from ‘itsdangerous‘

该库在2.0.0版本之后就将TimedJSONWebSignatureSerializer类弃用了,引导用户使用直接支持JWS/JWT的库,如authlib。 解决方案:要么使用2.0.0版本之前的itsdangerous库,继续使用该类,要么换用authlib库来生成token。

LeetCode刷题复盘笔记—1373. 二叉搜索子树的最大键值和

今日主要总结一下&#xff0c;1373. 二叉搜索子树的最大键值和 题目&#xff1a;1373. 二叉搜索子树的最大键值和 Leetcode题目地址 题目描述&#xff1a; 给你一棵以 root 为根的 二叉树 &#xff0c;请你返回 任意 二叉搜索子树的最大键值和。 二叉搜索树的定义如下&…

【GNN从入门到精通】第二章 Graph Embedding

文章目录一、Graph Embedding的作用二、DeepWalk三、LINE四、SDNE五、Node2vec六、Struc2vec七、总结八、代码一、Graph Embedding的作用 优点&#xff1a; 保留了节点在图上的信息简化了节点的特征长度 二、DeepWalk 参数说明&#xff1a; window size&#xff1a;给定一个…

蜂窝移动通信系统

什么是蜂窝移动通信系统 5G的“G”是Generation的首部字母&#xff0c;5G即“第五代”&#xff0c;全称是“第五代蜂窝移动通信系统”。 在移动通信技术发展的早期阶段&#xff0c;采用大区制的通信方式。是指一个基站的覆盖范围很大&#xff0c;能够达到几十甚至上百公里范围。…

WEB安全之javascript基础(一):js的引入方法注释变量数据类型

WEB安全之javascript基础&#xff08;一&#xff09;&#xff1a;js的引入方法注释变量数据类型概述1、嵌入方法内嵌式外链式行内式2、语句3、注释4、变量5、JavaScript 保留关键字6、JavaScript 作用域Javascrpt 局部变量JavaScript 全局变量7、数据类型判断类型概述 JavaScri…

【基于熵权-模糊综合评价法】《基于熵权-模糊综合评价法的施工项目风险评价研究》论文笔记(内附MATLAB代码)

原文链接&#xff1a;基于熵权-模糊综合评价法的施工项目风险评价研究 - 中国知网 (cnki.net) 【基于熵权-模糊综合评价法】《基于熵权-模糊综合评价法的施工项目风险评价研究》论文笔记&#xff08;内附MATLAB代码&#xff09; 文章目录 1.施工项目风险评价指标体系 2.构建…

BOOK DAO - 《元宇宙创意图谱》 提案发布

01 背景在元宇宙概念与行业应用落地爆发式发展的时代&#xff0c;元宇宙概念阐述与行业报告分析等专业文章产出呈纷乱混杂之势&#xff0c;水平可信度不一。集理论、项目解读、实践教程与科普综合为一体的读物尤为稀少&#xff0c;甚至可以说是出版行业的空白。大众接触元宇宙的…