【C++初阶】引用计数和写时拷贝是什么?用来干嘛的?

在这里插入图片描述

👦个人主页:@Weraphael
✍🏻作者简介:目前学习C++和算法
✈️专栏:C++航路
🐋 希望大家多多支持,咱一起进步!😁
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注✨


目录

  • 一、问题引入
  • 二、引用计数
  • 三、写时拷贝
  • 四、vs下的sizeof(对象)

一、问题引入

我们知道,默认不写拷贝构造函数和赋值运算符重载的话,编译器会自动生成,当然也可以手动编写。如果不手动编写,编译器会默认生成一个浅拷贝,这种拷贝方式对于内置类型或者是自定义类型的成员变量来说是没有问题的
但是如果类中有动态分配内存的指针变量,我们就会发现浅拷贝的时候会出现以下两个问题:

  1. 共用同一块空间会被析构两次
  2. 修改一个对象就会影响另外一个

在这里插入图片描述

而我们知道,深拷贝的特性就是会额外开辟一块空间,那有没有不额外开销内存来达到类似深拷贝的功能呢?答案当然是有的!

二、引用计数

引用计数是一种基于对象引用数量的内存管理方式。每个对象都会维护一个引用计数器,记录当前有多少个指针指向该对象。当一个新的指针指向该对象时,引用计数加一;当一个指针不再指向该对象时,引用计数减一。当引用计数为零时,表示没有任何指针指向该对象,系统可以安全地释放该对象所占用的内存。因此,引用计数可以解决浅拷贝析构两次的问题

在这里插入图片描述

三、写时拷贝

在写时接贝的机制下,当一个对象被复制时,实际上并没有立即进行内存的复制。而是在需要修改其中一个对象时,才会进行实际的内存拷贝操作将原始对象和副本对象分离开来

具体的实现方式可以理解为:在对象被复制时,原始对象和副本对象共享同一块内存。当要对其中一个对象进行修改时,系统会先检查该对象的引用计数。如果引用计数为1(即只有当前对象指向该内存块),则可以直接修改该内存块;如果引用计数大于1(即有其他对象也指向该内存块),则会进行实际的内存复制操作,将原始对象和副本对象分离开来,用人话来说就会进行深拷贝,然后再进行修改。

在这里插入图片描述

有的人就会想,写时拷贝还是要进行深接贝,好像没什么用。这其实是人博弈的心理,例如:有的人就用深拷贝,但是就是不对其内容进行修改,那么这样的深接贝代价太大了。而写时拷贝只有在需要修改时才会进行实际的内存复制操作,避免了不必要的复制。节省内存开销。

四、vs下的sizeof(对象)

以下代码输出的结果是什么?

#include <iostream>
#include <string>

using namespace std;

int main()
{
	string s1("hello world");
	cout << sizeof(s1) << endl;
	
	return 0;
}

【个人分析】

我们知道,string的底层结构是:

class string
{
	char* str;
	size_t size;
	size_t capacity;
};

根据结构体的内存对齐规则:

在这里插入图片描述

从上分析出结果是12

【vs下的输出结果】

在这里插入图片描述

为什么输出的结果是28

实际上,vs这个编辑器对string对象做了一个以空间换时间的处理。vs给每个对象加了一个长度为16buff数组。当对象的长度不足16的时候,不需要开空间,直接放到这个数组中,当长度大于等于16的时候才进行开空间。而hello world的长度是小于16。所以最后的结果为:12 + 18 = 28

在这里插入图片描述

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

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

相关文章

08-微信小程序视图层

08-微信小程序视图层 文章目录 视图层 ViewWXML数据绑定列表渲染条件渲染模板引用importimport 的作用域include WXSS尺寸单位样式导入内联样式选择器全局样式与局部样式 WXS注意事项页面渲染数据处理 视图层 View 框架的视图层由 WXML 与 WXSS 编写&#xff0c;由组件来进行…

从零玩转系列之微信支付实战PC端装修我的订单页面 | 技术创作特训营第一期

一、前言 欢迎来到本期的博客&#xff01;本篇文章是 PC 端的结尾了,前面经历过九个章节到本章节刚刚好十章节感谢观看我的文章,那么接下来我们将要编写的是我的订单页面. GGBOM! 本篇完毕后将是 UniApp 的篇章感受移动端的诱惑 &#x1f497; 本次为前端知识点如果不懂前段可以…

人流目标跟踪pyqt界面_v5_deepsort

直接上效果图 代码仓库和视频演示b站视频006期&#xff1a; 到此一游7758258的个人空间-到此一游7758258个人主页-哔哩哔哩视频 代码展示&#xff1a; YOLOv5 DeepSORT介绍 YOLOv5 DeepSORT是一个结合了YOLOv5和DeepSORT算法的目标检测与多目标跟踪系统。让我为您详细解释一…

RocketMQ消费者可以手动消费但无法主动消费问题,或生成者发送超时

1.大多数是配置问题 修改rocketmq文件夹broker.conf 2.配置与集群IP或本地IPV4一样 重启 在RocketMQ独享实例中支持IPv4和IPv6双栈&#xff0c;主要是通过在网络层面上同时支持IPv4和IPv6协议栈来实现的。RocketMQ的Broker端、Namesrv端和客户端都需要支持IPv4和IPv6协议&…

SAP安全库存-安全库存共享、安全库存简介

SAP系统中的安全库存用于管理计划外和计划内的库存需求,在某些行业中,由于不同的情况,如意外损耗、损坏、环境问题、制造工艺问题、需求增加等,通常会出现意外的库存需求。 SAP提供了维护安全库存的处理方式来处理这样的问题,安全库存的字段信息在主数据视图中,在物料需…

CentOS系统环境搭建(九)——centos系统下使用docker部署项目

centos系统环境搭建专栏&#x1f517;点击跳转 关于Docker-compose安装请看CentOS系统环境搭建&#xff08;三&#xff09;——Centos7安装Docker&Docker Compose&#xff0c;该文章同样收录于centos系统环境搭建专栏。 Centos7部署项目 采用前后端分离的形式部署。使用Do…

三维可视化平台有哪些?Sovit3D可视化平台怎么样?

随着社会经济的发展和数字技术的进步&#xff0c;互联网行业发展迅速。为了适应新时代社会发展的需要&#xff0c;大数据在这个社会经济发展过程中随着技术的进步而显得尤为重要。同时&#xff0c;大数据技术的快速发展进程也推动了可视化技术的飞速发展&#xff0c;国内外各类…

融媒行业落地客户旅程编排,详解数字化用户运营实战

移动互联网时代是流量红利的时代&#xff0c;企业常用低成本的方式进行获客&#xff0c;“增长黑客”的概念大范围传播。与此同时&#xff0c;机构媒体受到传播环境的影响&#xff0c;也开始启动全行业的媒体融合转型。在此背景下&#xff0c;2015 年神策数据成立&#xff0c;核…

八、Linux下,grep/wc/管道符/echo/重定向符/tail如何使用?

1、grep命令 &#xff08;1&#xff09;主要用于文件 &#xff08;2&#xff09;主要作用是“通过关键字&#xff0c;过滤文件行” &#xff08;3&#xff09;示例&#xff1a; 2、wc命令 &#xff08;1&#xff09;统计文件的行数、单词数等 &#xff08;2&#xff09;示例…

求Win11系统virtualbox+vagrant安装MacOS虚拟机

文章目录 一、背景二、素材2.1、virtualboxvagrant 三、问题3.1、安装失败3.2、第二个失败3.3、网络说 四、求助 一、背景 题主&#xff0c;主要是穷&#xff0c;没钱买mac笔记本或相关系统的苹果产品&#xff0c;哈哈&#xff0c;偶尔也有用过MacOS系统&#xff0c;只是还没有…

【Axure高保真原型】通过输入框动态控制环形图

今天和大家分享通过输入框动态控制环形图的原型模板&#xff0c;在输入框里维护项目数据&#xff0c;可以自动生成对应的环形图&#xff0c;鼠标移入对应扇形&#xff0c;可以查看对应数据。使用也非常方便&#xff0c;只需要修改输入框里的数据&#xff0c;或者复制粘贴文本&a…

git错误记录

露id没有影响&#xff0c;搞得微软不知道我ip一样 git fatal: 拒绝合并无关的历史的错误解决(亲测有效)

基于Python的微博大数据舆情分析,舆论情感分析可视化系统,可作为Python毕业设计

运行效果图 基于Python的微博大数据舆情分析&#xff0c;舆论情感分析可视化系统 系统介绍 微博舆情分析系统&#xff0c;项目后端分爬虫模块、数据分析模块、数据存储模块、业务逻辑模块组成。 先后进行了数据获取和筛选存储&#xff0c;对存储后的数据库数据进行提取分析处…

Harmony OS教程学习笔记

基础知识 1.如何修改程序启动的第一个页面&#xff1f; 不想使用创建的默认的页面&#xff0c;这时需要修改启动页面&#xff0c;修改的地方在EntryAbility文件中的onWindowStageCreate方法中。 onWindowStageCreate(windowStage: window.WindowStage) {// Main window is cr…

解决Mac系统android monitor启动时卡住,显示白屏的问题

一.启动环境 清安装1.8版本的jdk&#xff0c;java1.8版本以上不支持android monitor&#xff1b;如果你电脑上安装有java 11等高级别的版本&#xff0c;请自行搜索&#xff0c;如果在mac上安装多jdk&#xff0c;以及如何切换到1.8版本上 二.解决方案 请更新SWT插件&#xff…

1+X试点Web前端开发考证实训室建设方案

一 、系统概述 1X试点Web前端开发是计算机类专业重要的核心课程&#xff0c;课程所包含的教学内容多&#xff0c;实践性强&#xff0c;并且相关技术更新快。传统的课堂讲授模式以教师为中心&#xff0c;学生被动式接收&#xff0c;难以调动学生学习的积极性和主动性。混合式教学…

VMware vSphere Client端设置热添加虚拟机的CPU和内存

使用vSphere Client连接到VMware ESXi Server&#xff0c;在“配置→网络”中&#xff0c;可以看到&#xff0c;当前有两个虚拟交换机&#xff0c;并且为该虚拟交换机分配了管理地址10.10.228.81&#xff0c;点击“添加网络”如图所示。 添加配置向导&#xff0c;在网络类型&am…

python入门篇02- 注释,变量,数据类型,运算符及条件控制语句

目录 1. 前言:2. python基础使用-> 2.1 注释的使用---> 2.1.1 单行注释示例: ---> 2.1.2 多行注释 -> 2.2 变量---> 2.2.1 整数类型/浮点类型/字符串类型---> 2.2.2 变量的简单使用---> 2.2.3 查看类型与类型转换---> 2.2.4 变量命名语法规则--->2.…

[uni-app] uview封装Popup组件,处理props及v-model的传值问题

文章目录 需求及效果遇到的问题解决的办法偷懒的写法 需求及效果 uView(1.x版本)中, 有Pop弹出层的组件, 现在有个需求是,进行简单封装,有些通用的设置不想每次都写(比如 :mask-custom-style"{background: rgba(0, 0, 0, 0.7)}"这种) 然后内部内容交给插槽去自己随…
最新文章