calldata memory storage 区别详细讲解

这篇具有很好参考价值的文章主要介绍了calldata memory storage 区别详细讲解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

首先明确一点 calldata memory storage 都是用来修饰饮用类型的。

强制指定的数据位置:
    •    外部函数(就是说使用external关键字的函数)的参数(不包括返回参数): calldata,效果跟 memory 差不多
    •    状态变量: storage
默认数据位置:
    •    函数参数(包括返回参数): memory
    •    所有其它局部变量: storage

Solidity变量的数据存储位置

现在让我们回到memory关键字。从0.5.0版本开始,所有的复杂类型必须 显式指定其存储的数据位置,有三种可选的数据位置:memory、storage 和calldata。

注意:唯一可以省略数据位置声明的是状态变量,因为状态变量始终保存 在账号的存储中。

storage/存储

  • 存储中的数据是永久存在的。存储是一个key/value库
  • 存储中的数据写入区块链,因此会修改状态,这也是存储使用成本高的原因。
  • 占用一个256位的槽需要消耗20000 gas
  • 修改一个已经使用的存储槽的值,需要消耗5000 gas
  • 当清零一个存储槽时,会返还一定数量的gas
  • 存储按256位的槽位分配,即使没有完全使用一个槽位,也需要支付其开销

memory/内存

  • 内存是一个字节数组,槽大小位256位(32字节)
  • 数据仅在函数执行期间存在,执行完毕后就被销毁
  • 读或写一个内存槽都会消耗3gas
  • 为了避免矿工的工作量过大,22个操作之后的单操作成本会上涨

calldata/调用数据

  • 调用数据是不可修改、非持久化的区域,用来保存函数参数,其行为类似于内存
  • 外部函数的参数必须使用calldata,但是也可用于其他变量
  • 调用数据避免了数据拷贝,并确保数据不被修改
  • 函数也可以返回使用calldata声明的数组和结果,但是不可能分配这些类型

Storage 变量是指永久存储在区块链中的变量。 Memory 变量则是临时的,当外部函数对某合约调用完成时,内存型变量即被移除。

状态变量(在函数之外声明的变量)默认为“storage”形式,并永久写入区块链;而在函数内部声明的变量默认是“memory”型的,它们函数调用结束后消失。

处理函数内的结构体和数组的时候需要指定数据的类型是 storage 还是 memory。文章来源地址https://www.toymoban.com/news/detail-467326.html

到了这里,关于calldata memory storage 区别详细讲解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Gradle和Maven的详细讲解和两者之间的区别

    Gradle 是一种基于 Groovy 语言的构建自动化工具,用于构建、测试和部署项目。它使用声明式的脚本来定义构建过程,允许开发者灵活地配置项目构建。Gradle 使用一种被称为 Groovy DSL(领域特定语言)的语法,使构建脚本易于编写和维护。 主要特点: 声明式构建脚本: Gradle

    2024年02月12日
    浏览(40)
  • Java:读取excel文件中的内容(简单、详细、明确、有全部代码)

    注意: jxl 仅支持读取 .xls 文件,读 .xlsx 会报错! 在 pom.xml 中引入 jxl 的依赖 支持读取 xlsx 文件的 poi 依赖说明、使用方法及更多详细内容可以参考: Java读取excel的方式,一篇文章看懂(详细)

    2024年02月12日
    浏览(44)
  • 容器化部署和传统部署的四个区别详细讲解-行云管家

    随着互联网技术进步,我们已经从传统部署过渡到了容器化部署时代。但还有很多小伙伴对于两者之间的区别不是很了解,这里我们小编就给大家详细讲解一下。 容器化部署和传统部署的四个区别详细讲解 区别1、定义不同 容器化部署是指将软件代码和所需的所有组件(例如

    2024年02月11日
    浏览(38)
  • 【Docker】Docker的优势、与虚拟机技术的区别、三个重要概念和架构及工作原理详细讲解

    前言 Docker 是一个 开源的应用容器引擎 ,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux或Windows 操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 作者简介: 辭七七,目前大一,正在学习

    2024年02月15日
    浏览(45)
  • Ubuntu20.04安装Nvidia驱动——4060显卡(黑屏解决方法) 1.首先禁用Nouveau(Ubuntu安装显卡驱动详细步骤)

    如果按照正常方法安装不成功(如无法连接第二屏幕,nvidia-smi无显示),先尝试在安装后不管什么方法进入桌面后在应用程序中找到NVIDIA X Server Settings,在最后一项PRIME Profiles将NVIDIA On-Demand改为Performance Mode,重启后正常,安装深度学习环境也无问题,但是我的神州刷新率还

    2024年02月05日
    浏览(87)
  • 【Docker】Docker的优势、与虚拟机技术的区别、三个重要概念和架构及工作原理的详细讲解

    前言 Docker 是一个 开源的应用容器引擎 ,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux或Windows 操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 📕作者简介: 热爱跑步的恒川 ,致力于

    2024年02月09日
    浏览(49)
  • 你是真的“C”——实用memory类库函数的详细实现和使用

        😎博客昵称:博客小梦 😊最喜欢的座右铭:全神贯注的上吧!!! 😊作者简介:一名热爱C/C++,算法等技术、喜爱运动、热爱K歌、敢于追梦的小博主! 😘博主小留言:哈喽! 😄各位CSDN的uu们,我是你的博客好友小梦,希望我的文章可以给您带来一定的帮助,话不

    2024年02月02日
    浏览(44)
  • 学好虚拟化,首先要学Linux

    上次讲到了虚拟化的基础知识,比如虚拟化的应用、各个厂商都是通过何种技术路径来实现的等等,本篇想记录一下我学习到的CPU内存虚拟化和网络虚拟化相关知识,通过记录来制造反馈,让自己更有效地学习。需要注意的是,学习虚拟化就免不了和Linux打交道了。 在此之前

    2023年04月20日
    浏览(39)
  • 【ARMv9 DSU-120 系列 4.2 -- Utility Bus 访问的 memory-mapped 寄存器详细介绍】

    请阅读 【Arm® DynamIQ™ Shared Unit-120 专栏 】 ARMv9架构中的DSU-120(DynamIQ™ Shared Unit-120)提供了一组Cluster系统控制寄存器,这些寄存器可以通过两种方式访问: 通过Utility Bus上的内存映射访问 :允许外部设备或核心之外的系统与DSU-120的控制寄存器进行交互。 通过核心的系统寄

    2024年04月29日
    浏览(34)
  • 加密项目是否采用DAO模式 首先考量这8个因素

    随着越来越多公司寻求管理和组织战略创新,我们看到市场对 DAO  的兴趣日益增长,同时也对人们的数字生活产生了巨大影响。不过, 并不是每个项目都适合采用 DAO 模式,在做出正确选择之前,你需要考虑以下 8 个要点: 1、集中服务和大规模项目不建议用 DAO 对于 Web3

    2024年01月22日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包