当前位置: 首页 > news >正文

Mojo值的生命周期(Life of a value)详解

到目前为止,我们已经解释了 Mojo 如何允许您使用 Mojo 的所有权模型构建内存安全的高性能代码而无需手动管理内存。但是,Mojo 是为 系统编程而设计的,这通常需要对自定义数据类型进行手动内存管理。因此,Mojo 允许您根据需要执行此操作。需要明确的是,Mojo 没有引用计数器和垃圾收集器。
Mojo 也没有具有特殊权限的内置数据类型。标准库中的所有数据类型(例如Bool、 Int和 String)都以 结构体形式实现。您实际上可以使用MLIR 方言提供的低级原语编写自己的这些类型的替代品 。

Mojo 语言的优点在于它为您提供了这些用于系统编程的低级工具,但在一个框架内,可以帮助您构建安全且易于从高级程序使用的东西。也就是说,您可以深入底层并编写您想要的所有“不安全”代码,但只要您按照 Mojo 的值语义进行操作,实例化您的类型/对象的程序员根本不需要考虑内存管理,而且由于值所有权,行为将是安全且可预测的。

总之,类型作者有责任管理每个值​​类型的内存和资源,方法是根据需要实现特定的生命周期方法,例如构造函数、复制构造函数、移动构造函数和析构函数。Mojo 默认不创建任何构造函数,但它确实为未定义自己的类型添加了一个简单的无操作析构函数。

接下来,我们将准确解释如何根据值语义定义这些生命周期方法,以便您的类型能够很好地与值所有权兼容。

生命周期和寿命(Lifecycles and lifetimes)


首先,让我们澄清一些术语:

  • 值的“生命周期”由结构中的各种dunder方法定义。每个生命周期事件都由不同的方法处理,例如构造函数(__init__())、析构函数(__del__()。所有使用相同类型声明的值都具有相同的生命周期。
  • 值的“生命周期”由程序执行期间每个值被视为有效的时间跨度定义。值的生命周期从初始化时开始,到销毁时结束,通常(但并非总是)从__init__()到__del__()。没有两个值具有完全相同的生命周期,因为每个值都是在不同的时间点创建和销毁的(即使差异是不可感知的)。

Mojo 中值的生命周期始于变量初始化时,一直持续到最后一次使用该值,此时 Mojo 会将其销毁。Mojo 会在不再使用每个值/对象时立即销毁它,使用在每个子表达式之后运行的“尽快”(ASAP) 销毁策略。

您可能可以想象,如果在程序的生命周期中,某个值在多个函数之间多次共享,那么跟踪该值的生命周期可能会很困难。但是,Mojo 通过其值语义和值所有权部分地使这一点变得可预测。生命周期管理的最后一块拼图是值的生命周期:每个值(在结构中定义)都需要实现关键的生命周期方法,这些方法定义了如何创建和销毁值。

值的生命周期(Life of a value)


Mojo 中值的生命周期始于变量初始化时,一直持续到最后一次使用该值,此时 Mojo 会将其销毁。

Mojo 中的所有数据类型(包括标准库中的基本类型,例如 Bool、 Int和 String,以及复杂类型,例如SIMD和 object)都定义为 struct。这意味着任何数据的创建和销毁都遵循相同的生命周期规则,并且您可以定义自己的数据类型,其工作方式完全相同。

Mojo 结构没有任何默认的生命周期方法,例如构造函数、复制构造函数或移动构造函数。这意味着您可以在没有构造函数的情况下创建结构,但您无法实例化它,并且它只能用作静态方法的一种命名空间。例如:

struct NoInstances:var state: Int@staticmethodfn print_hello():print("Hello world!")

如果没有构造函数,则无法实例化 this,因此它没有生命周期。该 state字段也是无用的,因为它无法初始化(Mojo 结构不支持默认字段值 - 只有必须在构造函数中初始化它们)。

NoInstances.print_hello()

输出:

Hello world!

以下代码无法通过编译。

   print(NoInstances.state) #cannot access instance field 'state' without an instance of 'NoInstances'

构造函数


要创建 Mojo 类型的实例,需要__init__()构造函数方法。构造函数的主要职责是初始化所有字段。例如:

struct MyPet:var name: Stringvar age: Intfn __init__(inout self, name: String, age: Int):self.name = nameself.age = age

现在我们可以创建一个实例:

var mine = MyPet("Loki", 4)

的实例MyPet也可以被 borrowed 和 destroyed,但目前不能被复制或移动。

我们认为这是一个很好的默认起点,因为没有内置的生命周期事件,也没有意外行为。您(类型作者)必须通过实现复制和移动构造函数来明确决定是否可以复制或移动类型以及如何复制或移动类型。

Mojo 不需要析构函数来销毁对象。只要结构中的所有字段都是可销毁的(标准库中的每个类型都是可销毁的, 指针除外),那么 Mojo 就知道如何在其生命周期结束时销毁该类型。我们将在值的消亡中进一步讨论这一点。

重载构造函数


与其他函数/方法一样,您可以 重载构造函数 __init__()以使用不同的参数初始化对象。例如,您可能需要一个默认构造函数来设置一些默认值并且不接受任何参数,然后需要接受更多参数的附加构造函数。

请注意,为了修改任何字段,每个构造函数都必须使用inout约定声明self参数。如果要从另一个构造函数调用一个构造函数,只需像在外部调用一样调用该构造函数(无需传递self)

例如,下面是如何从重载构造函数委托工作的方法:

struct MyPet:var name: Stringvar age: Intfn __init__(inout self):self.name = ""self.age = 0fn __init__(inout self, name: String):self = MyPet()self.name = name

字段初始化


请注意,在上例中,每个构造函数结束时,所有字段都必须初始化。这是构造函数中唯一的要求。

事实上,只要所有字段都已初始化,__init__()构造函数就足够聪明,甚至在构造函数完成之前就将self对象视为已完全初始化。例如,一旦所有字段都初始化,此构造函数就可以传递self:

fn use(arg: MyPet):passstruct MyPet:var name: Stringvar age: Intfn __init__(inout self, name: String, age: Int, cond: Bool):self.name = nameif cond:self.age = ageuse(self)  # Safe to use immediately!self.age = ageuse(self)  # Safe to use immediately!

下面的初始化会报错

struct MyPet:var name: Stringvar age: Intfn __init__(inout self, name

相关文章:

Mojo值的生命周期(Life of a value)详解

到目前为止,我们已经解释了 Mojo 如何允许您使用 Mojo 的所有权模型构建内存安全的高性能代码而无需手动管理内存。但是,Mojo 是为 系统编程而设计的,这通常需要对自定义数据类型进行手动内存管理。因此,Mojo 允许您根据需要执行此操作。需要明确的是,Mojo 没有引用计数器…...

java对接kimi详细说明,附完整项目

需求: 使用java封装kimi接口为http接口,并把调用kimi时的传参和返回数据,保存到mysql数据库中 自己记录一下,以做备忘。 具体步骤如下: 1.申请apiKey 访问:Moonshot AI - 开放平台使用手机号手机号验证…...

鸿蒙媒体开发【基于AVCodec能力的视频编解码】音频和视频

基于AVCodec能力的视频编解码 介绍 本实例基于AVCodec能力,提供基于视频编解码的视频播放和录制的功能。 视频播放的主要流程是将视频文件通过解封装->解码->送显/播放。视频录制的主要流程是相机采集->编码->封装成mp4文件。 播放支持的原子能力规…...

django集成pytest进行自动化单元测试实战

文章目录 一、引入pytest相关的包二、配置pytest1、将django的配置区分测试环境、开发环境和生产环境2、配置pytest 三、编写测试用例1、业务测试2、接口测试 四、进行测试 在Django项目中集成Pytest进行单元测试可以提高测试的灵活性和效率,相比于Django自带的测试…...

48天笔试训练错题——day40

目录 选择题 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 编程题 1. 发邮件 2. 最长上升子序列 选择题 1. DNS 劫持又称域名劫持,是指在劫持的网络范围内拦截域名解析的请求,分析请求的域名,把审查范围以外的请求放行,否则返回…...

LabVIEW在DCS中的优势

DCS(Distributed Control System,分布式控制系统)是一种用于工业过程控制的自动化系统。它将控制任务分散到多个控制单元中,通过网络连接和协调这些单元来实现对整个过程的监控和控制。DCS通常用于大型工业设施,如化工…...

英特尔:从硅谷创业到全球科技巨头

在科技行业,英特尔不仅是一个品牌,更是一种精神的象征。自1968年成立以来,英特尔经历了从初创企业到全球半导体产业领导者的华丽转变,其发展历程是科技创新与市场战略完美结合的典范。本文将深入探讨英特尔的发展历程,…...

生物计算与纳米技术:交汇前沿的科学领域

在当今科技迅猛发展的时代,生物计算和纳米技术作为前沿科技领域的两个重要方向,正在逐渐融合并带来深远的影响。生物计算涉及使用生物系统进行计算和数据存储,而纳米技术则关注制造极小尺度的电子器件和材料科学。本文将深入探讨这两个领域的…...

C#中栈和队列

在C#中,Stack和Queue是两种不同的集合类型,它们用于实现后进先出(LIFO)和先进先出(FIFO)的数据结构。 Stack(堆栈) Stack是一个后进先出的集合,这意味着最后一个添加到堆…...

技战法丨攻防演练防御——纵深、联动、诱捕(可搬运、可cv)

演习活动经过近几年的发展,攻击方的专业水平已大幅提高,逐渐呈现出隐秘化、APT化的趋势。其利用渗透技术对目标系统做深入探测,不断挖掘防守方网络系统的薄弱环节,这就要求防守方构建立体式纵深防护体系来抵御入侵。同时&#xff…...

1、 window平台opencv下载编译, 基于cmake和QT工具链

1. 环境准备,源码下载 1.1 前置环境 qt 下载安装cmake 安装,可参考: https://blog.csdn.net/qq_51355375/article/details/139186681 1.2 opencv 源码下载 官网地址: https://opencv.org/releases/ 下载源码: 2 …...

C++20三向比较运算符详解

三向比较运算符可以用于确定两个值的大小顺序&#xff0c;也被称为太空飞船操作符。使用单个表达式&#xff0c;它可以告诉一个值是否等于&#xff0c;小于或大于另一个值。 它返回的是类枚举&#xff08;enumeration-like&#xff09;类型&#xff0c;定义在 <compare> …...

监听机制与耗电量

一、监听机制与耗电量的关系 监听机制通常涉及对特定事件、状态或数据的持续监测。在移动设备和嵌入式系统中&#xff0c;这种监听可能由多种组件和传感器实现&#xff0c;如GPS、传感器&#xff08;如加速度计、陀螺仪&#xff09;、网络连接等。监听的频率越高&#xff0c;意…...

C++ //练习 16.29 修改你的Blob类,用你自己的shared_ptr代替标准库中的版本。

C Primer&#xff08;第5版&#xff09; 练习 16.29 练习 16.29 修改你的Blob类&#xff0c;用你自己的shared_ptr代替标准库中的版本。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 template <typename> class BlobP…...

【Mode Management】CanNm处于PBS状态下接收到一帧诊断报文DCM会响应吗

目录 前言 正文 1.CanNm从RSS状态切换到PBS状态行为分析 1.1.CanNm动作 1.2.ComM动作 1.3.DCM动作 1.4 小结 2.CanNM在PBS状态下收到一帧诊断报文行为分析 2.1.DCM动作1 2.2. ComM动作 2.3. DCM动作2 2.3. CanNm动作 2.4 问题 2.5 分析 3.总结 前言 我们知道EC…...

【C++】模版:范式编程、函数模板、类模板

目录 一.范式编程 二.函数模板 1.概念与格式 2.原理 3.实例化 4.匹配规则 三.类模板 一.范式编程 在写C函数重载的时候&#xff0c;可能会写很多同一类的函数&#xff0c;例如交换函数&#xff1a; void Swap(int& left, int& right) {int temp left;left r…...

验证图片旋转

最近在使用百度图片翻译时遇到一个问题&#xff0c;就是图片会翻转90&#xff0c;经与百度沟通&#xff0c;发现是原始图片中有个旋转参数引起的。 于是写个demo验证一下。 // 获取元数据中的旋转方向 func getOrientation() int {//打开图像文件f, err : os.Open("image…...

宏景eHR /ajax/ajaxService SQL注入漏洞复现

0x01 产品简介 宏景eHR人力资源管理软件是一款人力资源管理与数字化应用相融合,满足动态化、协同化、流程化、战略化需求的软件。 0x02 漏洞概述 宏景eHR /ajax/ajaxService 接口处存在SQL注入漏洞,,未经身份验证的远程攻击者通过利用SQL注入漏洞配合数据库xp_cmdshell可…...

从源码看 Redis:深入理解 redisDb 和 redisObject

Redis 是一个广泛使用的内存数据库&#xff0c;以其高性能和丰富的数据结构而闻名。不同于磁盘数据库&#xff0c;磁盘数据库将数据读取到文件中维护&#xff0c;而内存数据库将数据存储在内存中&#xff0c;意味着其想要维护数据&#xff0c;必须在代码中维护一个保存数据的结…...

unity中实现流光效果——世界空间下

Properties{_MainTex ("Texture", 2D) "white" {}_FlowColor ("Flow Color", Color) (1, 1, 1, 1) // 流光颜色_FlowFrequency ("Flow Frequency", Float) 1.0 // 流光频率_FlowSpeed ("Flow Speed", Float) 1.0 // 流光…...

项目经验分享:用4G路由器CPE接海康NVR采用国标GB28181协议TCP被动取流一段时间后设备就掉线了

最近我们在做一个生态化养殖的项目时&#xff0c;发现一个奇怪的现象&#xff1a; 项目现场由于没有有线网络&#xff0c;所以&#xff0c;我们在现场IPC接入到海康NVR之后&#xff0c;再通过一款4G的CPE接入到天翼云的国标GB28181视频平台&#xff1b;我们采用UDP协议播放NVR…...

【RabbitMQ】RabbitMQ不公平分发_预取值

一、不公平分发 1、简介 RabbitMQ中的不公平分发&#xff08;Unfair Dispatch&#xff09;是指当多个消费者&#xff08;Consumers&#xff09;同时订阅同一个队列&#xff08;Queue&#xff09;时&#xff0c;消息的分发机制并非严格平均或公平&#xff0c;而是基于某些条件…...

最新AI模型使用指南和模型

市面上最好的AI大模型 OpenAI GPT-4&#xff1a; 概述&#xff1a;GPT-4 是 OpenAI 发布的最新一代大型语言模型&#xff0c;具备更强的理解和生成自然语言的能力。特点&#xff1a; 强大的文本生成和理解能力。支持多语言处理。可用于各种应用场景&#xff0c;如对话生成、内容…...

数据结构之八大基本排序方法

在数据结构中&#xff0c;排序是一个重要的操作&#xff0c;它有助于提高数据的可读性和可操作性。排序算法有多种&#xff0c;各有优缺点&#xff0c;适用于不同的场景。以下是八大经典排序算法的介绍&#xff1a; 1. 冒泡排序&#xff08;Bubble Sort&#xff09; 原理&…...

《Milvus Cloud向量数据库指南》——什么是高可用:深入理解数据库系统中的高可用性架构

什么是高可用:深入理解数据库系统中的高可用性架构 在信息技术日新月异的今天,高可用性(High Availability,简称HA)已成为衡量一个系统,尤其是数据库系统稳定性和可靠性的重要标准。高可用性的核心目标在于确保系统能够持续不断地提供服务,最大限度地减少因维护活动、硬…...

C++ | Leetcode C++题解之第319题灯泡开关

题目&#xff1a; 题解&#xff1a; class Solution { public:int bulbSwitch(int n) {return sqrt(n 0.5);} };...

C# 使用 NLog 输出日志到文件夹

在项目中使用 NuGet 安装 NLog 包以及 NLog.Config 包 配置 nlog.config 在项目的根目录下创建一个 Nlog.config 文件&#xff08;如果还没有&#xff09;&#xff0c;然后添加如下配置&#xff1a; <?xml version"1.0" encoding"utf-8" ?> <…...

node.js使用NodeMachineID 生成唯一UUID和注意事项

node-machine-id用于获取或生成唯一的机器ID 如何使用 const { machineId, machineIdSync } require(node-machine-id) JSON.stringify(machineIdSync({original: true})) ;方法&#xff1a; machineIdSync 此函数同步获取操作系统本机UUID/GUID&#xff0c;默认情况下进行哈…...

AI大模型在数据治理中的应用

目前&#xff0c;企业的数据治理工作以人工实施为主&#xff0c;其中一些重复性较强的工作&#xff0c;如&#xff1a;数据标准制定和映射、元数据信息完善、数据目录挂载等&#xff0c;需要消耗大量的人力和时间成本&#xff0c;这给本来就难以量化业务价值的治理工作的顺利推…...

【初学人工智能原理】【12】循环:序列依赖问题

前言 本文教程均来自b站【小白也能听懂的人工智能原理】&#xff0c;感兴趣的可自行到b站观看。 代码及工具箱 本专栏的代码和工具函数已经上传到GitHub&#xff1a;1571859588/xiaobai_AI: 零基础入门人工智能 (github.com)&#xff0c;可以找到对应课程的代码 正文 对于…...

移动端网站开发/百度联盟点击广告赚钱

1、cat /proc/version 2、cat /etc/redhat-release 3、cat /proc/version 4、uname -a 转载于:https://www.cnblogs.com/zhi-leaf/p/6848410.html...

免费二级网站/常见的搜索引擎有哪些

昨天晚上躺下刚准备睡觉&#xff0c;忽然听见外面吵闹的声音&#xff0c;仔细听又听不出来说的什么&#xff0c;因为说的是白话&#xff1a;&#xff09;&#xff0c;时而还有敲打铁门的声音&#xff0c;我猜想大概是某人深夜晚归&#xff0c;忘记带钥匙&#xff0c;被LP锁在门…...

重庆网站建设网络推广/企业网站的作用和意义

构造函数的特点&#xff1a;自动会被调动&#xff0c;自己不能主动调动构造函数 构造函数是拿一种整型数据来初始化对象&#xff0c;也就是内置类型 拷贝构造函数是拿一个对象去初始化另一个对象空间&#xff0c;存活在1.实参对象和形参对象结合时&#xff0c;2.return 返回一个…...

哈尔滨手机网站建设/百度seo查询收录查询

1.refullmatch() 完全匹配字符串则返回object&#xff0c;否则返回None import res "max123uyt146"print(re.fullmatch("\w\w",s))# <_sre.SRE_Match object; span(0, 13), matchmax123uyt146>2.re.compile() 两种方法返回的同一个对象&#xff0…...

zenme用ps做网站图/怎么样免费做网站

1.阿里分布式事务Seata介绍 作者&#xff1a;屹远&#xff08;陈龙&#xff09;&#xff0c;蚂蚁金服分布式事务核心研发 。 本文根据 8月11日 SOFA Meetup#3 广州站 《分布式事务 Seata 及其三种模式详解》主题分享整理&#xff0c;着重分享分布式事务产生的背景、理论基础&a…...

成都 网站推广/北京网站优化常识

1&#xff0e;CREATE <folder> CREATE可以创建指定名字的新邮箱。邮箱名称通常是带路径的文件夹全名。&#xff08;有些IMAP客户机使用邮件夹称呼新邮箱&#xff09; C: A003 CREATE owatagusiam/ /*创建一个新目录owatagusiam*/ S: A003 OK CREATE comp…...