day09了 加油

浅拷贝 指向同一个地址空间

右边不可取地址 左边一定是到了具体的位置

右值引用std:: move

相信大家默认构造函数都没有问题,所以就不贴例子了

浅拷贝构造函数

只负责复制地址,而不是真的把完整的内存给它

#include <iostream>// 浅拷贝是通过默认的复制构造函数来实现的。默认的复制构造函数会逐个复制对象的所有成员变量,但不会复制动态分配的内存。浅拷贝只是复制指针而不复制指针指向的内容。class Shallow {
public:int* data;// 构造函数Shallow(int d) {data = new int(d);}// 浅拷贝构造函数Shallow(const Shallow& source) : data(source.data) {std::cout << "Shallow copy constructor - shallow copy" << std::endl;}// 析构函数~Shallow() {delete data;std::cout << "Destructor freeing data" << std::endl;}
};int main() {Shallow obj1(42);Shallow obj2 = obj1; // 使用浅拷贝构造函数std::cout << "obj1 data: " << *obj1.data << std::endl;std::cout << "obj2 data: " << *obj2.data << std::endl;return 0;
}

深拷贝构造函数

其实跟深拷贝的意思一样,真正的什么都复制

还要分配新的内存

#include <iostream>class Deep {
public:int* data;// 构造函数Deep(int d) {data = new int(d);}// 深拷贝构造函数Deep(const Deep& source) {data = new int(*source.data);std::cout << "Deep copy constructor - deep copy" << std::endl;}// 析构函数~Deep() {delete data;std::cout << "Destructor freeing data" << std::endl;}
};int main() {Deep obj1(42);Deep obj2 = obj1; // 使用深拷贝构造函数std::cout << "obj1 data: " << *obj1.data << std::endl;std::cout << "obj2 data: " << *obj2.data << std::endl;return 0;
}

浅拷贝构造函数的代码会遇到一个问题,就是出现悬空指针,析构的时候会指向同一个指针

而深拷贝就避免了这个问题

为了提升性能,因此就来了新的概念 

移动语义

用移动构造函数和移动赋值运算符。

移动构造函数(Move Constructor)是C++11引入的一种特殊构造函数,

用于实现对象资源的高效转移,而不是复制。

它的引入是为了避免不必要的深拷贝,提高程序性能,特别是当处理临时对象时。

移动构造函数的概念

  • 移动构造函数允许从一个即将销毁的对象(通常是临时对象)中“窃取”资源,而不是复制资源。
  • 移动构造函数接收一个右值引用参数,即将被移动的对象,并将其资源转移到新对象中。
  • 移动构造函数通常与移动赋值运算符一起使用,以实现全面的移动语义。

这里建议直接看例子

移动构造函数的语法

移动构造函数的声明使用右值引用参数(通常是 Type&&,并在实现中转移资源。

#include <iostream>class Mstring {
public:char* data;// 默认构造函数Mstring() : data(nullptr) {std::cout << "Default constructor called" << std::endl;}// 参数构造函数Mstring(const char* str) {if (str) {data = new char[strlen(str) + 1];strcpy(data, str);} else {data = nullptr;}std::cout << "Parameterized constructor called" << std::endl;}// 拷贝构造函数Mstring(const Mstring& source) {if (source.data) {data = new char[strlen(source.data) + 1];strcpy(data, source.data);} else {data = nullptr;}std::cout << "Copy constructor called" << std::endl;}// 移动构造函数Mstring(Mstring&& source) noexcept : data(source.data) {source.data = nullptr;std::cout << "Move constructor called" << std::endl;}// 拷贝赋值运算符Mstring& operator=(const Mstring& source) {if (this == &source)return *this;delete[] data;if (source.data) {data = new char[strlen(source.data) + 1];strcpy(data, source.data);} else {data = nullptr;}std::cout << "Copy assignment operator called" << std::endl;return *this;}// 移动赋值运算符Mstring& operator=(Mstring&& source) noexcept {if (this == &source)return *this;delete[] data;data = source.data;source.data = nullptr;std::cout << "Move assignment operator called" << std::endl;return *this;}// 析构函数~Mstring() {delete[] data;std::cout << "Destructor called" << std::endl;}
};int main() {Mstring str1("Hello");Mstring str2("World");// 使用移动赋值运算符str2 = std::move(str1);std::cout << "After move assignment, str1: " << (str1.data ? str1.data : "nullptr") << std::endl;std::cout << "After move assignment, str2: " << (str2.data ? str2.data : "nullptr") << std::endl;return 0;
}

参数构造函数

参数构造函数是C++类的一种构造函数,

它接受一个或多个参数,

并使用这些参数来初始化类的成员变量。

与默认构造函数(不接受任何参数)相对,

参数构造函数为类的实例提供了一种灵活的初始化方式。

参数构造函数的定义

参数构造函数是在类的定义中声明的构造函数,

其参数列表可以包含一个或多个参数。

通过这些参数,构造函数可以对类的成员变量进行初始化。上面的例子是有体现的

  • 默认构造函数Mstring(),不接受任何参数,初始化成员变量 datanullptr
  • 参数构造函数Mstring(const char* str),接受一个 const char* 参数,用于初始化成员变量 data。如果参数不为空,则分配足够的内存并复制字符串内容。
  • 拷贝构造函数Mstring(const Mstring& source),用于创建一个现有对象的副本,分配新的内存并复制内容。
  • 移动构造函数Mstring(Mstring&& source) noexcept,用于高效地从另一个即将销毁的对象中移动资源,避免了不必要的内存分配和复制。
  • 拷贝赋值运算符:用于将一个对象的内容赋值给另一个现有对象,确保正确地处理动态分配的内存。
  • 移动赋值运算符:用于将一个即将销毁的对象的内容移动到另一个现有对象,避免不必要的内存分配和复制。
  • 析构函数~Mstring(),释放动态分配的内存,避免内存泄漏。
  • main 函数:演示如何使用参数构造函数创建对象,以及如何使用移动构造函数进行对象移动。

内存提前分配

内存提前分配(Pre-allocation)是指在对象或数据结构初始化时提前分配所需的内存,以减少运行时的分配开销。这在需要处理大量数据或频繁分配和释放内存的场景中特别有用。

参数构造函数中的内存提前分配示例

下面是一个改进的 Mstring 类,展示了如何在参数构造函数中提前分配内存。

#include <iostream>class Array {
private:int* data;size_t size;public:// 参数构造函数:提前分配内存Array(size_t size) : size(size) {data = new int[size]; // 提前分配内存std::cout << "Constructor: Allocated memory for " << size << " integers." << std::endl;}// 析构函数:释放内存~Array() {delete[] data;std::cout << "Destructor: Freed allocated memory." << std::endl;}// 获取数组大小size_t getSize() const {return size;}// 获取数组元素(带边界检查)int getElement(size_t index) const {if (index < size) {return data[index];} else {throw std::out_of_range("Index out of range");}}// 设置数组元素(带边界检查)void setElement(size_t index, int value) {if (index < size) {data[index] = value;} else {throw std::out_of_range("Index out of range");}}
};int main() {// 使用参数构造函数创建一个大小为10的数组Array arr(10);// 设置数组中的元素for (size_t i = 0; i < arr.getSize(); ++i) {arr.setElement(i, i * 2);}// 获取并打印数组中的元素for (size_t i = 0; i < arr.getSize(); ++i) {std::cout << "Element at index " << i << ": " << arr.getElement(i) << std::endl;}// arr对象超出作用域时,会自动调用析构函数释放内存return 0;
}

内存重复利用

1.分配一块内存2构建对象3使用对象4析构对象5销毁内存

1.优先使用dowhile循环

压栈的开销非常大,因此避免重复调用

面向对象和面向过程的区别

面向过程和面向对象的区别-CSDN博客

什么是内联函数

函数移除不必要的多态性 减省空间

性能在面向对象中最顶的

swich 跳转很快

简化表达式+位移算法

IO优化

Vector

list

set/multiset

map/Multiset

选择策略

性能分析工具

Asan

实现原理: 编译的时候。。。方式

Gprof

Valgrind

Perf

能看到函数调用次数

系统资源对性能的影响

进程选取

更新当前任务虚拟时间

异构cpu+多频率带

内存管理

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

shell 脚本编程

简介&#xff1a;用户通过shell向计算机发送指令的&#xff0c;计算机通过shell给用户返回指令的执行结果 通过shell编程可以达到的效果&#xff1a;提高工作效率、可以实现自动化 需要学习的内容&#xff1a;Linux 、 shell的语法规范 编写shell的流程&#xff1a; 第一步…

数据库系统体系结构-DBMS的三级模式结构、DBMS的工作方式、模式定义语言、二级映射

一、体系结构的概念 1、大多数DBMS遵循三级模式结构 &#xff08;1&#xff09;外模式 &#xff08;2&#xff09;概念模式 &#xff08;3&#xff09;内模式 2、DBMS的体系结构描述的应该是系统的组成结构及其联系以及系统结构的设计和变化的原则等 3、1978年美国国家标…

Java学习 (七) 面向对象--多态、object类

一、多态性 多态在java中的体现是 父类的引用指向子类的对象 格式&#xff1a; 父类类型 变量名 子类对象 1、代码案例 vi Person.java public class Person {public String name;public int age;//新增方法public void eat(){System.out.println("人吃饭");}…

github仓库的基本使用-创建、上传文件、删除

1.第一步 先点击左侧菜单栏的远程仓库 2.点击NEW 3.创建仓库 然后点击右下角的 CREATE 4.点击code 点击SSH,然后我出现了You don’t have any public SSH keys in your GitHub account. You can add a new public key, or try cloning this repository via HTTPS. 1&#xff…

【MySQL备份】Percona XtraBackup加密备份实战篇

目录 1.前言 2.准备工作 2.1.环境信息 2.2.配置/etc/my.cnf文件 2.3.授予root用户BACKUP_ADMIN权限 2.4.生成加密密钥 2.5.配置加密密钥文件 3.加密备份 4.优化加密过程 5.解密加密备份 6.准备加密备份 7.恢复加密备份 7.1.使用rsync进行恢复 7.2.使用xtrabackup命令恢…

order by优化案例与原理剖析

一、引言 在数据库查询中&#xff0c;ORDER BY 语句用于对结果集进行排序&#xff0c;是日常开发中不可或缺的一部分。然而&#xff0c;随着数据量的增长&#xff0c;ORDER BY 的性能问题逐渐凸显。本文将结合一个实际案例&#xff0c;分析如何优化 ORDER BY 的性能&#xff0…

ICCV2023图像相关论文摘要速览两部分

tips&#xff1a;有两部分的原因主要是我筛选的时候没有统一image & images Paper1 PromptCap: Prompt-Guided Image Captioning for VQA with GPT-3 摘要原文: Knowledge-based visual question answering (VQA) involves questions that require world knowledge beyon…

深度学习之半监督学习:一文梳理目标检测中的半监督学习策略

什么是半监督目标检测&#xff1f; 传统机器学习根据训练数据集中的标注情况&#xff0c;有着不同的场景&#xff0c;主要包括&#xff1a;监督学习、弱监督学习、弱半监督学习、半监督学习。由于目标检测任务的特殊性&#xff0c;在介绍半监督目标检测方法之前&#xff0c;我…

YOLO10 用分割数据集训练

1、 下载Funiture数据集 http://kaggle.com/datasets/nicolaasregnier/furniture 并生成数据配置文件 data.yaml import yaml import os dataDir "你的工程路径/Furniture/sam_preds_training_set" os.path.join(dataDir, train) num_classes 2 classes [Chair, …

为什么要使用多线程(并发编程)

目录 1.上下文的切换 1.1 什么是上下文切换 2. 并发编程的死锁问题 2.1 死锁产生的原因 2.2 避免死锁的方法 3.资源限制的挑战3.1 什么是资源限制 并发编程的目的是为了让程序更快&#xff0c;大家都知道并不是开启的线程越多越快&#xff0c;因为开启的线程越多随即面临…

【驱动篇】龙芯LS2K0300之红外驱动

实验目标 编写HX1838红外接收器驱动&#xff0c;根据接收的波形脉冲解码红外按键键值 模块连接 模块连接&#xff1a;VCC接Pin 2&#xff0c;GND接Pin1&#xff0c;DATA接Pin16 驱动代码 HX1838 GPIO初始化&#xff0c;申请中断&#xff0c;注意&#xff1a;GPIO48默认是给…

部署最新版本elasticsearch 8.14.1和 kibana 8.14.1

部署最新版的elasticsearch和kibana&#xff0c;前提时已经部署docker 设置用户密码 export ELASTIC_PASSWORD"<ES_PASSWORD>" # 设置elastic用户密码 export KIBANA_PASSWORD"<KIB_PASSWORD>" # 设置kibana_system密码创建docker网络 保…

实用的网站

前端 精简CSS格式 Font Awesome 图标库 BootCDN 加速服务 LOGO U钙网 AI AI工具集 视频下载 B站视频解析下载

2023-2024华为ICT大赛中国区 实践赛网络赛道 全国总决赛 理论部分真题

Part1 数通模块(10题)&#xff1a; 1、如图所示&#xff0c;某园区部署了IPv6进行业务测试&#xff0c;该网络中有4台路由器&#xff0c;运行OSPFv3实现网络的互联互通&#xff0c;以下关于该OSPFv3网络产生的LSA的描述&#xff0c;错误的是哪一项?(单选题) A.R1的LSDB中将存在…

Appium adb 获取appActivity

方法一&#xff08;最简单有效的方法&#xff09; 通过cmd命令&#xff0c;前提是先打开手机中你要获取包名的APP adb devices -l 获取连接设备详细信息 adb shell dumpsys activity | grep mFocusedActivity 有时获取到的不是真实的Activity 方法二 adb shell monkey -p …

【瑞吉外卖 | day01】项目介绍+后台登录退出功能

文章目录 瑞吉外卖 — day011. 所需知识2. 软件开发整体介绍2.1 软件开发流程2.2 角色分工2.3 软件环境 3. 瑞吉外卖项目介绍3.1 项目介绍3.2 产品原型展示3.3 技术选型3.4 功能架构3.5 角色 4. 开发环境搭建4.1 数据库环境搭建4.2 Maven项目构建 5. 后台系统登录功能5.1 创建需…

会声会影2024破解版下载 让视频编辑更简单、更有趣

在数字时代&#xff0c;视频已经成为我们生活中不可或缺的一部分。无论是记录生活、分享快乐&#xff0c;还是宣传产品、传递信息&#xff0c;视频都扮演着重要的角色。然而&#xff0c;对于很多人来说&#xff0c;视频编辑却是一个让人望而却步的领域。复杂的软件操作、繁琐的…

容器安全:等保合规性的基石

随着云计算和微服务架构的蓬勃发展&#xff0c;容器技术已经成为现代IT基础设施不可或缺的一部分。在网络安全等级保护制度&#xff08;等保&#xff09;的框架下&#xff0c;容器安全的要求日益凸显&#xff0c;成为等保合规性的基石。本文将深入探讨容器安全在等保中的重要性…

【kneighborsclassifier 函数及其参数介绍】

文章目录 一、kneighborsclassifier是什么&#xff1f;二、使用步骤三、kneighborsclassifier函数及其参数详解1. 参数说明 一、kneighborsclassifier是什么&#xff1f; kneighborsclassifier 是 scikit-learn 库中 K-近邻算法的实现&#xff0c;用于分类任务。KNN 算法的基本…

爽!强化学习+注意力机制,吞吐量提升了10多倍!

通过引入注意力机制&#xff0c;强化学习模型不仅能够更加高效地处理复杂的环境和任务&#xff0c;还能在学习和决策过程中实现更高的精度和适应性。 因此这种结合迅速成为了各大领域的研究热点&#xff0c;而且已经在实际应用中有了显著的性能提升。比如分散式强化学习框架SA…