2411d,右值与移动

原文

概述

添加语言内部__rvalue(Expression)函数,指示对匹配函数参数,按右值对待.这在用非引用语义调用函数时启用移动语义.

移动语义运行时和资源效率可取的,因为可移动资源新对象,而不是复制然后析构.其他语言(如C++)有流行移动语义.

先前的工作

C++移动语义这里
RustC++移动语义对比这里
C++语义有害(Rust更好)这里

描述

语法

RvalueExpression是个附加PrimaryExpression:

RvalueExpression:
    __rvalue ( AssignExpression )

重载

如果同时有引用非引用参数重载,则偏爱匹配右值非引用参数,而偏爱左值引用参数匹配.RvalueExpression最好与非引用参数匹配.

右值参数匹配参数语义

调用函数拥有对待右值参数.因此,如果左值与右值参数匹配,则会给函数传递左值副本.然后,在函数结束时该函数对(如果有)参数调用析构器.

不会复制右值参数,因为按唯一假设它,且在函数结束时也会析构它.编译器会自动函数体附加析构.

函数无法知道其参数源右值还是左值的副本.

即在函数返回时,__rvalue(左值式)参数析构式.不能继续使用左值式.在传递给函数后,编译器并不总是可检测到使用,即对象的析构器必须按其初值或至少是良性值,重置对象的内容.

struct S
{
    ubyte* p;
    ~this()
    {
      free(p);
      //在此添加:`'p=null;'`
    }
}
void aggh(S s)
{
}
void oops()
{
    S s;
    s.p = cast(ubyte*)malloc(10);
    aggh(__rvalue(s));
    free(s.p); //错误,两次释放`s.p`
}

__rvalue移动赋值

struct S
{
    ubyte* p;
    ~this()
    {
      free(p);
      p = null;
    }
    void opAssign(S s)
    {
        this.p = s.p;
        s.p = null;
    }
}
void oops()
{
    S s;
    s.p = cast(ubyte*)malloc(10);
    S t;
    t = __rvalue(s);
}

__rvalue移动构造

struct S
{
    ubyte* p;
    ~this()
    {
      free(p);
      p = null;
    }
    this(S s)
    {
        this.p = s.p;
        s.p = null;
    }
}
void oops()
{
    S s;
    S t = __rvalue(s);
}

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

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

相关文章

从0开始学习机器学习--Day21--算法的评估标准

准确率和召回率(precision and recall) 在上一章我们提到了在每次运行算法时通过返回一个实数值来判断算法的好坏,但是我们该如何构建这个实数的计算公式呢,毕竟这关乎于我们对算法的判断,不能过于夸大或贬低。有一个典型的会被影响的很大例…

集群架构中Lua脚本的限制以及出现的报错

🚀 博主介绍:大家好,我是无休居士!一枚任职于一线Top3互联网大厂的Java开发工程师! 🚀 🌟 在这里,你将找到通往Java技术大门的钥匙。作为一个爱敲代码技术人,我不仅热衷…

快速傅里叶变换(FFT)基础(附python实现)

对于非专业人士,傅里叶变换一直是一个神秘的武器,它可以分析出不同频域的信息,从时域转换到频域,揭示了信号的频率成分,对于数字信号处理(DSP)、图像、语音等数据来说,傅里叶变换是最…

python数据结构操作与可视化的应用

Python具有丰富的数据结构操作和可视化库,可以进行各种数据结构的创建、编辑和分析,并将结果可视化。以下是几个常见的Python数据结构操作和可视化的应用示例: 1. 列表(List)操作和可视化: - 创建列表&a…

DataFrame

目录 一、创建DataFrame二、Sql语法三、DSL语法四、RDD与DataFrame互相转换 一、创建DataFrame 在SparkSql中SparkSession是创建DataFrame和执行Sql的入口,创建DataFrame有三种方式: 通过Spark的数据源进行创建 从一个存在的RDD进行转换 从Hive Tabl…

C# 实现对指定句柄的窗口进行键盘输入的实现

在C#中实现对指定句柄的窗口进行键盘操作,可以通过多种方式来实现。以下是一篇详细的指南,介绍如何在C#中实现这一功能。 1. 使用Windows API函数 在C#中,我们可以通过P/Invoke调用Windows API来实现对指定窗口的键盘操作。以下是一些关键的…

GitHub个人主页美化

效果展示 展示为静态效果,动态效果请查看我的GitHub页面 创建GitHub仓库 创建与GitHub用户名相同的仓库,当仓库名与用户名相同时,此仓库会被视作特殊仓库,其README.md(自述文件)会展示在GitHub个人主页…

2024-09-01 - 分布式集群网关 - LoadBalancer - 阿里篇 - 流雨声

摘要 通过公有云部署创建类似 MateLB 的应用负载,可以更加方便的对系统资源进行合理规划。 应用实践 CCM提供Kubernetes与阿里云基础产品(例如CLB、VPC等)对接的能力,支持在同一个CLB后端挂载集群内节点和集群外服务器&#xf…

【销帮帮-注册_登录安全分析报告-试用页面存在安全隐患】

联通支付注册/登录安全分析报告 前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨…

初识Linux · 匿名管道

目录 前言: 匿名管道 理解为什么? 理解是什么? 理解怎么做? 前言: 引入管道之前,我们引入几个问题,进程通信的相关问题。 第一个是进程之间为什么要通信,对于进程间通信来说&…

Linux(CentOS)设置防火墙开放8080端口,运行jar包,接收请求

1、查看防火墙状态 systemctl status firewalld 防火墙开启状态 2、运行 jar 包,使用8080端口 程序正常启动 3、使用 postman 发送请求,失败 4、检查端口是否开放(需更换到 root 用户) firewall-cmd --zonepublic --query-por…

window11安装elasticsearch+Kibana

1、下载elasticsearch与elasticsearch 下载elasticsearch 查看elasticsearch对应的Kibana版本 下载elasticsearch解压后文件目录如下 可执行脚本文件,包括启动elasticsearch服务、插件管理、函数命令等 bin配置文件目录,如elasticsearch配置、角色配置、jvm配置等 conf 默认…

[单例模式]

[设计模式] 设计模式是软件工程中的一种常见做法, 它可以理解为"模板", 是针对一些常见的特定场景, 给出的一些比较好的固定的解决方案. 不同语言适用的设计模式是不一样的. 这里我们接下来要谈到的是java中典型的设计模式. 而且由于设计模式比较适合有一定编程经…

MethodChannel插件的用法

文章目录 1 知识回顾2 示例代码3 经验总结我们在上一章回中介绍了通道相关的内容,本章回中将介绍其中的一种通道:MethodChannnel.闲话休提,让我们一起Talk Flutter吧。 1 知识回顾 我们在上一章回中介绍了通道的概念和作用,并且提到了通道有不同的类型,本章回将其中一种通…

Golang | Leetcode Golang题解之第554题砖墙

题目: 题解: func leastBricks(wall [][]int) int {cnt : map[int]int{}for _, widths : range wall {sum : 0for _, width : range widths[:len(widths)-1] {sum widthcnt[sum]}}maxCnt : 0for _, c : range cnt {if c > maxCnt {maxCnt c}}retur…

通讯录(C 语言)

目录 一、通讯录设计思路1. 伪代码设计思路2. 代码设计思路 二、代码实现三、程序运行演示四、整体分析 一、通讯录设计思路 1. 伪代码设计思路 通讯录可以用来存储 100 个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址。 提供方法&#x…

深入解析四种核心网络设备:集线器、桥接器、路由器和交换机

计算机网络系列课程《网络核心设备》 在现代网络技术中,集线器、桥接器、路由器和交换机扮演着至关重要的角色。本文,将深入探讨这四种设备的功能、工作原理及其在网络架构中的重要性。 集线器:基础网络连接设备 集线器(Hub&…

01 Oracle 数据库存储结构深度解析:从数据文件到性能优化的全链路探究

文章目录 Oracle 数据库存储结构深度解析:从数据文件到性能优化的全链路探究一、Oracle存储结构的物理层次1.1 控制文件(Control File)1.2 联机重做日志文件(Online Redo Log File)1.3 数据文件(Data File&…

Type-C转DP线方案

在现代数字化生活中,高清视频传输已成为日常需求的重要组成部分。无论是工作中的多屏协作,还是娱乐中的沉浸式体验,高清显示器都扮演着不可或缺的角色。然而,随着设备接口的多样化,如何高效地将Type-C设备连接至Displa…

【c++篇】:栈、队列、优先队列:容器世界里的秩序魔法 - stack,queue与priority_queue探秘

✨感谢您阅读本篇文章,文章内容是个人学习笔记的整理,如果哪里有误的话还请您指正噢✨ ✨ 个人主页:余辉zmh–CSDN博客 ✨ 文章所属专栏:c篇–CSDN博客 文章目录 前言一.容器stack1.介绍2.成员函数3.模拟实现4.注意事项 二.容器qu…