首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >返回类型引用(ref-qualified)的C++成员函数暗示了什么?

返回类型引用(ref-qualified)的C++成员函数暗示了什么?

原创
作者头像
mariolu
发布于 2023-09-03 08:08:09
发布于 2023-09-03 08:08:09
41810
代码可运行
举报
运行总次数:0
代码可运行

一、引子:

返回引用类型的成员函数是 暗示了使用它的this指针是左值还是右值。反过来说,如果一个成员函数不返回引用类型,那么对this指针是左值还是右值都是调用同一个函数。

比如说:这段代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Obj o{2}; o.getVal();

跟这段代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Obj{2}.getVal()

使用了同一个getVal()函数。

那理解到这里是对的吗?


二、解释:

先说结论,来说一个c++的一个理解。

如果成员函数是有一致性(consistency)的,那么non-const, non-static的函数 总是要被&( &-qualified)。

举个例子

这个例子里你不能做

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
inc(A{}) 

但是可以做

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 A{}.inc().

不能做是因为内部语言有意这么设计,因为 A{} 传给 inc( A{} ) 函数,你期待这个函数对暂存值A{}进行修改,但是A{}传进去后就销毁了,caller并没有感知到。而另一种写法A{}.inc()是被允许的。这是consistency的做法。


三、扩展

当然书写设计自己的成员函数,不一定都有必要去做ref-qualified,但是这里我带你看一些使用ref-qualified的真实例子。

3.1、只对右值形参操作

一种场景是上面这个例子,防止用户错误地将一个暂存值传入给函数,然后期盼这个函数做出修改。(换句话说,只允许成员函数操作右值形参。这个情况这个函数应该被修饰为 &&-qualified)。比如说这个函数会从对象object取到资源resources,然后处于未指定的状态。

有时候一个成员函数需要有能力从类中取到资源,那么他就能被右值rvalue call到,否则,它就是const修饰的成员函数。看这个例子std::string::substr有用const&重载,也有用&&重载的两个函数。

3.2、将一个函数的return value传递作为给另一个函数的输入

这种场景需要&- overload和&&-overload (+ potentiallyconst/volatilevariations)。可以看std::optional::value这个例子。


四、未来C++23

在 C++23 有显式的对象, 因为用户可以forward上次的references. 也有可能简单地写一个non-static成员函数。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
1 条评论
热度
最新
这篇文章的分析是基于linux 什么版本的内核分析的?
这篇文章的分析是基于linux 什么版本的内核分析的?
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
从内核世界透视 mmap 内存映射的本质(原理篇)
之前有不少读者给笔者留言,希望笔者写一篇文章介绍下 mmap 内存映射相关的知识体系,之所以迟迟没有动笔,是因为 mmap 这个系统调用看上去简单,实际上并不简单,可以说是非常复杂的一个系统调用。
bin的技术小屋
2023/10/30
6.1K4
从内核世界透视 mmap 内存映射的本质(原理篇)
HugePages(大内存页)实现完全解析
在《一文读懂 HugePages的原理》一文中介绍了 HugePages(大内存页)的原理和使用,现在我们来分析一下 Linux 内核是怎么实现 HugePages 分配的。
用户7686797
2021/05/11
3.2K0
HugePages(大内存页)实现完全解析
五万字 | 深入理解Linux内存管理
作者简介: 程磊,一线码农,在某手机公司担任系统开发工程师,日常喜欢研究内核基本原理。 1.1 内存管理的意义 1.2 原始内存管理 1.3 分段内存管理 1.4 分页内存管理 1.5 内存管理的目标 1.6 Linux内存管理体系 2.1 物理内存节点 2.2 物理内存区域 2.3 物理内存页面 2.4 物理内存模型 2.5 三级区划关系 3.1 Buddy System 3.1.1 伙伴系统的内存来源 3.1.2 伙伴系统的管理数据结构 3.1.3 伙伴系统的算法逻辑 3.1.4 伙伴系统的接口 3.1
刘盼
2022/08/26
4.5K0
五万字 | 深入理解Linux内存管理
​Linux内核透明巨型页支持
处理大内存的性能关键计算应用程序工作集已经运行在libhugetlbfs之上,然后依次运行 hugetlbfs。透明的巨型页面支持是另一种使用大页为虚拟内存提供大页支持的方法, 该支持自动提升和降低页面大小和没有hugetlbfs的缺点。
用户7244416
2022/08/31
3.2K0
Linux内存管理 一个进程究竟占用多少空间?-VSS/RSS/PSS/USS
关键词:VSS、RSS、PSS、USS、_mapcount、pte_present、mem_size_stats。
sunsky
2020/08/20
6.1K0
Linux内存管理 一个进程究竟占用多少空间?-VSS/RSS/PSS/USS
Linux:/proc/meminfo参数详细解释
/proc/meminfo是了解Linux系统内存使用状况的主要接口,我们最常用的”free”、”vmstat”等命令就是通过它获取数据的 ,/proc/meminfo所包含的信息比”free”等命令要丰富得多,然而真正理解它并不容易,比如我们知道”Cached”统计的是文件缓存页,manpage上说是“In-memory cache for files read from the disk (the page cache)”,那为什么它不等于[Active(file)+Inactive(file)]?AnonHugePages与AnonPages、HugePages_Total有什么联系和区别?很多细节在手册中并没有讲清楚,本文对此做了一点探究。
233333
2023/07/24
2K0
Linux:/proc/meminfo参数详细解释
【内存管理】内存布局介绍
32位操作系统的内存布局很经典,很多书籍都是以32位系统为例子去讲解的。32位的系统可访问的地址空间为4GB,用户空间为1GB ~ 3GB,内核空间为3GB ~ 4GB。
嵌入式与Linux那些事
2024/07/04
3760
【内存管理】内存布局介绍
一文聊透 Linux 缺页异常的处理 —— 图解 Page Faults
在前面两篇介绍 mmap 的文章中,笔者分别从原理角度以及源码实现角度带着大家深入到内核世界深度揭秘了 mmap 内存映射的本质。从整个 mmap 映射的过程可以看出,内核只是在进程的虚拟地址空间中寻找出一段空闲的虚拟内存区域 vma 然后分配给本次映射而已。
bin的技术小屋
2023/12/21
4.3K0
一文聊透 Linux 缺页异常的处理 —— 图解 Page Faults
一步一图带你深入理解 Linux 物理内存管理
在上篇文章 《深入理解 Linux 虚拟内存管理》 中,笔者分别从进程用户态和内核态的角度详细深入地为大家介绍了 Linux 内核如何对进程虚拟内存空间进行布局以及管理的相关实现。在我们深入理解了虚拟内存之后,那么何不顺带着也探秘一下物理内存的管理呢?
bin的技术小屋
2023/10/30
1.9K0
一步一图带你深入理解 Linux 物理内存管理
万字整理,肝翻Linux内存管理所有知识点
Linux的内存管理可谓是学好Linux的必经之路,也是Linux的关键知识点,有人说打通了内存管理的知识,也就打通了Linux的任督二脉,这一点不夸张。有人问网上有很多Linux内存管理的内容,为什么还要看你这一篇,这正是我写此文的原因,网上碎片化的相关知识点大都是东拼西凑,先不说正确性与否,就连基本的逻辑都没有搞清楚,我可以负责任的说Linux内存管理只需要看此文一篇就可以让你入Linux内核的大门,省去你东找西找的时间,让你形成内存管理知识的闭环。
用户6280468
2022/03/21
2.2K0
万字整理,肝翻Linux内存管理所有知识点
全民K歌内存篇2——虚拟内存浅析
《全民K歌内存篇1——线上监控与综合治理》 《全民K歌内存篇2——虚拟内存浅析》 《全民K歌内存篇3——native内存分析与监控》 一、简介 在多任务操作系统中,每个进程都拥有独立的虚拟地址空间,通过虚拟地址进行内存访问主要具备以下几点优势: 进程可使用连续的地址空间来访问不连续的物理内存,内存管理方面得到了简化。 实现进程与物理内存的隔离,对各个进程的内存数据起到了保护的作用。 程序可使用远大于可用物理内存的地址空间,虚拟地址在读写前不占用实际的物理内存,并为内存与磁盘的交换提供了便利。 Androi
QQ音乐技术团队
2021/03/04
4.2K0
Linux 进程内存监控:Linux 内存调优之进程内存深度监控
这里分析的工具主要是原生工具,后面还会分享一些 BPF 相关的内存观察工具以及系统内存的全局监控
山河已无恙
2025/04/13
1.3K0
Linux 进程内存监控:Linux 内存调优之进程内存深度监控
Linux性能调优之内存负载调优的一些笔记
「 原谅和忘记就意味着扔掉了我们获得的最贵经验 -------《人生的智慧》叔本华」
山河已无恙
2023/01/30
2.7K0
Linux性能调优之内存负载调优的一些笔记
聊聊 Linux 的内存统计
本文主要分析 Linux 系统内存统计的一些指标以及进程角度内存使用监控的一些方法。
程序员小强
2020/01/17
6.8K1
聊聊 Linux 的内存统计
【转】记一次 Redis 延时毛刺问题定位
原文 https://mp.weixin.qq.com/s/8A_y1dlZrUvpaJfbQrVK3w
保持热爱奔赴山海
2023/12/24
5520
【内存管理】页表映射基础知识
大家在看内核代码时会经常看的以上术语,但在ARM的芯片手册中并没有用到这些术语,而是使用L1,L2,L3页表这种术语。
嵌入式与Linux那些事
2024/06/11
7390
【内存管理】页表映射基础知识
深入理解Linux内核之mmu-gather操作
本文讲解Linux内核虚拟内存管理中的mmu_gather操作,看看它是如何保证刷tlb和释放物理页的顺序的,又是如何将更多的页面聚集起来统一释放的。
用户7244416
2022/04/28
2.6K0
深入理解Linux内核之mmu-gather操作
从 Linux 内核角度探秘 JDK MappedByteBuffer
在之前的文章《一步一图带你深入剖析 JDK NIO ByteBuffer 在不同字节序下的设计与实现》 中,笔者为大家详细剖析了 JDK Buffer 的整个设计体系,从总体上来讲,JDK NIO 为每一种 Java 基本类型定义了对应的 Buffer 类(boolean 类型除外)。
bin的技术小屋
2024/03/25
3660
从 Linux 内核角度探秘 JDK MappedByteBuffer
linux内核写时复制机制源代码解读
韩传华,就职于国内一家半导体公司,主要从事linux相关系统软件开发工作,负责Soc芯片BringUp及系统软件开发,乐于分享喜欢学习,喜欢专研Linux内核源代码。
Linux阅码场
2020/09/01
5.1K0
Linux内存管理
谈到内存管理,最先想到的就是分段和分页机制。计算机刚出现的时候,并没有这些,刚开始是直接使用的物理地址,也就是代码中操作的地址是可以直接和物理地址对应上的,可是后来随着多进程调度的需求,以及有限的物理内存,于是人们就开始做规定,比如对于一块内存,某个范围是属于内核,然后另外一个范围属于进程A,再另外一个范围属于进程B,如下图所示
一只小虾米
2023/03/19
14.6K0
Linux内存管理
相关推荐
从内核世界透视 mmap 内存映射的本质(原理篇)
更多 >
交个朋友
加入HAI高性能应用服务器交流群
探索HAI应用新境界 共享实践心得
加入[游戏服务器] 腾讯云官方交流站
游戏服运维小技巧 常见问题齐排查
加入架构与运维学习入门群
系统架构设计入门 运维体系构建指南
换一批
加入讨论
的问答专区 >
高级总监擅长4个领域
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档