C++之使用std::move与否实例区别(二百五十五)

news2024/11/29 0:51:43

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:理解C++之使用与不使用std::move的区别。

2.std::move介绍

1.std::move作用

std::move 是 C++11 引入的一个函数模板,主要用于转移指针的所有权。

    1. 转移所有权:std::move 将对象的所有权从一个对象转移到另一个对象,通过将参数转换为右值引用,实现对移动语义的支持。
    1. 避免不必要的拷贝:在某些情况下,可以通过使用std::move来避免不必要的拷贝操作,减少资源消耗。
    1. 支持移动语义:通过使用std::move,可以明确表示对于某个对象的移动操作,以提高性能和减少内存占用。
    1. 实现移动构造函数和移动赋值操作符:在自定义类中,可以通过使用std::move来实现移动构造函数和移动赋值操作符,实现高效的对象转移。
    1. 转移临时对象的所有权:在使用临时对象时,可以使用std::move来明确地将临时对象的所有权转移到另一个对象上。
    1. 支持移动语义的标准库类型:许多标准库中的类型(如std::stringstd::vector等)都提供了移动构造函数和移动赋值运算符,可以通过std::move来显式地调用这些函数。
    1. 支持移动语义的模板编程:在模板编程中,使用std::move可以明确表示对于对象的移动语义,使得代码更加清晰和高效。

std::move在 C++ 中扮演着非常重要的角色,为支持移动语义和提高性能提供了强大的工具。通过合理地利用std::move,可以实现对于对象所有权的有效转移,从而提高代码的性能和效率。

3.代码实例

1. 转移对象的所有权:std::move 可以将对象的所有权从一个对象转移到另一个对象,通过将参数转换为右值引用,实现对移动语义的支持。

#include <iostream>
#include <string>

int main() {
    std::string source = "Hello, world!";
    std::string destination = std::move(source);
    std::cout << "source: " << source << std::endl;        // 输出:source: 
    std::cout << "destination: " << destination << std::endl;  // 输出:destination: Hello, world!
    return 0;
}

2. 避免不必要的拷贝:在某些情况下,可以通过使用 std::move 来避免不必要的拷贝操作,减少资源消耗。

#include <string>

void processString(std::string&& s) {
    // 处理字符串
}

int main() {
    std::string str = "Hello";
    processString(std::move(str));  // 避免不必要的拷贝
    return 0;
}

3. 支持移动语义:通过使用 std::move,可以明确表示对于某个对象的移动操作,以提高性能和减少内存占用。

#include <vector>

int main() {
    std::vector<int> source = {1, 2, 3};
    std::vector<int> destination = std::move(source);
    // 现在 source 为空,destination 包含原始数据
    return 0;
}

4. 实现移动构造函数和移动赋值操作符:在自定义类中,可以通过使用 std::move 来实现移动构造函数和移动赋值操作符,实现高效的对象转移。

#include <iostream>

class MyObject {
public:
    // 移动构造函数
    MyObject(MyObject&& other) noexcept {
        // 执行资源移动
    }

    // 移动赋值操作符
    MyObject& operator=(MyObject&& other) noexcept {
        if (this != &other) {
            // 执行资源移动
        }
        return *this;
    }
};

int main() {
    MyObject obj1;
    MyObject obj2 = std::move(obj1);  // 移动构造函数
    MyObject obj3;
    obj3 = std::move(obj2);           // 移动赋值操作符
    return 0;
}

5. 转移临时对象的所有权:在使用临时对象时,可以使用 std::move 来明确地将临时对象的所有权转移到另一个对象上。

#include <vector>

void processVector(std::vector<int>&& vec) {
    // 处理移动过来的临时向量
}

int main() {
    processVector(std::vector<int>{1, 2, 3}); // 将临时向量的所有权转移给 processVector
    return 0;
}

6. 支持移动语义的标准库类型:许多标准库中的类型(如 std::string、std::vector 等)都提供了移动构造函数和移动赋值运算符,可以通过 std::move 来显式地调用这些函数。

#include <vector>

int main() {
    std::vector<int> source = {1, 2, 3};
    std::vector<int> destination = std::move(source); // 调用 std::vector 的移动构造函数
    return 0;
}

7. 支持移动语义的模板编程:在模板编程中,使用 std::move 可以明确表示对于对象的移动语义,使得代码更加清晰和高效。

#include <utility>
#include <vector>

template <typename T>
void processVector(T&& vec){
    std::vector<int> destination = std::move(vec);  // 显式调用 std::move,实现移动语义
    // 对 destination 进行处理
}

int main() {
    std::vector<int> source = {1, 2, 3};
    processVector(std::move(source)); // 在模板函数中使用 std::move 实现移动语义
    return 0;
}

8.使用拷贝对象方式,打印两个vector对比

#include <iostream>
#include <vector>
#include <string>

int main() {
  std::vector<std::string> v1{"hello", "world"};
  std::vector<std::string> v2;

  // 将v1的内容拷贝到v2中,此时两个对象都有值为:"hello world"的字符串
  v2 = v1;

  // v2现在包含了v1的元素
  std::cout << "v2 size: " << v2.size() << std::endl;
  for (const auto& s : v2) { // 遍历v2中的元素
    std::cout << s << " ";
    std::cout << std::endl;
  }
  
  printf("xxx--------------->%s, %s(), line = %d\n",__FILE__,__FUNCTION__,__LINE__);
  for (const auto& s : v1) { // 遍历v1中的元素
    std::cout << s << " ";
    std::cout << std::endl;
  }
  printf("xxx--------------->%s, %s(), line = %d\n",__FILE__,__FUNCTION__,__LINE__);
  return 0;
}

打印:
v1 size: 2
v2 size: 2
hello
world
xxx--------------->move_01.cpp, main(), line = 23
hello
world
xxx--------------->move_01.cpp, main(), line = 28

9.使用std::move转移对象方式,打印两个vector对比

#include <iostream>
#include <vector>
#include <string>

int main() {
  std::vector<std::string> v1{"hello", "world"};
  std::vector<std::string> v2;

  // 将v1的内容移动到v2中,此时v1中的vecrot字符为空
  v2 = std::move(v1);

  // v1现在为空
  std::cout << "v1 size: " << v1.size() << std::endl;

  // v2现在包含了v1的元素
  std::cout << "v2 size: " << v2.size() << std::endl;
  for (const auto& s : v2) { // 遍历v2中的元素
    std::cout << s << " ";
    std::cout << std::endl;
  }
  
  printf("xxx--------------->%s, %s(), line = %d\n",__FILE__,__FUNCTION__,__LINE__);
  for (const auto& s : v1) { // 遍历v1中的元素
    std::cout << s << " ";
    std::cout << std::endl;
  }
  printf("xxx--------------->%s, %s(), line = %d\n",__FILE__,__FUNCTION__,__LINE__);
  return 0;
}

打印:
v1 size: 0
v2 size: 2
hello
world
xxx--------------->move_01.cpp, main(), line = 23
xxx--------------->move_01.cpp, main(), line = 28

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

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

相关文章

香港优才计划获批概率跌破20%,拿香港身份越来越难了?

香港优才计划获批概率跌破20%&#xff0c;拿香港身份越来越难了&#xff1f; 截止10月31日&#xff0c;香港各类人才引进计划共收到18万4538宗申请&#xff0c;获批11万5741宗&#xff0c;整体“获批率”为62.72%。 具体到项目获批率&#xff1a; ①优才计划共收到63979宗申请&…

最终方案(乱)

为什么要在mos管上并一个快恢复二极管 因为电机成感性&#xff0c;为了在关断期间给它提供一个续流回路

单片机编程原则

多任务编程的概念 方式一&#xff1a;实时操作系统&#xff08;不建议新手使用&#xff09; 方式二 &#xff1a;裸机多任务模型 逻辑多任务的基本原理 把三个任务分别分为一个一个的片段 然后先执行任务一的第一个切片 执行第二个任务的第一个片段 执行第三个任务的第一个片…

SystemC 学习之与 Verilog 的混合仿真(十)

1、SC 与 Verilog 的通信方式 Systemc 和 verilog 通信方式有两种&#xff0c;一种是 PLI&#xff0c;但是 PLI 只能 verilog 调用 c/c&#xff0c;不能从 c/c 直接调用 verilog&#xff0c;想要从 c/c 调用 verilog 的话&#xff0c;需要先用 verilog 调用 c/c 函数&#xff…

企业邮箱认证指南:安全与高效的邮箱认证方法

企业邮箱是专门为企业提供的电子邮件服务&#xff0c;安全性和专业性更高。在开始使用企业邮箱之前&#xff0c;很多人会有一些问题&#xff0c;比如企业邮箱需要认证吗、如何开通企业邮箱&#xff0c;以及哪款企业邮箱好。 1、企业邮箱在使用前需要认证吗&#xff1f; 答案是肯…

div中的两个元素怎么实现上下排列

案例: 这里面的分享活动页和获取抽奖机会两个文字上下排列怎么实现? 答案: 父元素加上两个属性: display: flex; flex-direction: column; 就实现了

分布式下多节点WebSocket消息收发

1、使用场景 2、疑问 第一次发送请求后&#xff0c;通过N1&#xff0c;W2&#xff0c;到达service2&#xff0c;建立websocket连接。 1、接下来发送的消息&#xff0c;通过Ngixn后和网关gateway后还能落在service2上面吗&#xff1f; 如果不能落在service2上&#xff0c;需要怎…

【发表案例】IF6.5+,中科院2区,2个月录用,6天见刊!

计算机类SCIE 【期刊简介】IF&#xff1a;6.5-7.0&#xff0c;JCR1区&#xff0c;中科院2区 【检索情况】SCIE 在检&#xff0c;正刊 【征稿领域】数据表示、存储和处理、交换和访问、数据丢失处理等机器学习相关研究&#xff1b;云到物的连续体&#xff1b;数据结构架构&am…

ClickHouse联合创始人、前Google副总裁Yury到访杭州玖章算术公司,双方建立生态合作

10月31日&#xff0c;ClickHouse联合创始人Yury到访未来科技城&#xff0c;与玖章算术创始人叶正盛和国际总经理Ni Demai展开沟通与推进合作。 图片备注&#xff1a;Ni Demai(左),Yury(中),叶正盛(右) ClickHouse是深受开发者青睐的实时分析型数据库&#xff0c;成立2年就发展成…

微信加好友操作频繁了,怎么办?

近来&#xff0c;微信的风控是越来越严重&#xff0c;因为本身微信是作为一个社交软件&#xff0c;但流量大适合用来做私域营销。在日常使用微信中&#xff0c;我们也要了解下微信加好友的规则。 目前微信加人的规则是&#xff1a; 1、通过附近人功能加人上限15人/天&#xf…

制作企业期刊的必备工具,这个很强!

制作企业期刊是一项重要的任务&#xff0c;它不仅可以帮助企业展示自己的品牌形象&#xff0c;还可以促进内部员工的交流和合作。为了制作出一份高质量的企业期刊&#xff0c;你需要一些必备的工具。今天&#xff0c;给大家分享一款实用的工具-------FLBOOK在线制作电子杂志平台…

MS90C385B——+3.3V 150MHz 的 24bit 平板显示器(FPD) LVDS 信号发送器

MS90C385B 芯片能够将 28bit 的 TTL 数据转换成 4 通道的低压差分 信号 (LVDS) 。时钟通道经过锁相之后&#xff0c;与数据通道并行输出。当时钟频 率为 150MHz 时&#xff0c; 24bit 的 RGB 数据、 3bit 的 LCD 时序数据和 1bit 的控 制数据以 1050Mbps…

GLSL: Shader cannot be patched for instancing.

最近在 unity 里碰到了这么一个错误&#xff0c;只有这么点信息&#xff0c;让人看着挺懵逼的&#xff0c;后来发现&#xff0c;是因为 unity 的 terrain 组件在设置里勾了 Draw Instanced 选项导致的&#xff0c;感觉应该是 unity 的 bug。 因为错出在 2021&#xff0c;2022就…

11月编程榜最新出炉,第一名很离谱

这段时间&#xff0c;随着人工智能的崛起&#xff0c;Python的地位水涨船高。有不少朋友感觉到危机重重。 其中&#xff0c;最明显的&#xff0c;是市场环境的变化&#xff1a; 外部招聘&#xff1a;Python岗位日均需求量高达15000&#xff01;不仅是程序员&#xff0c;内容编…

Java 集合框架,泛型,包装类

文章目录 集合框架泛型Java 中的泛型裸类型&#xff08;了解&#xff09;原理泛型的上界泛型方法通配符 包装类ArrayList构造常见操作 LinkedListStackQueuePriorityQueueMapMap.Entry<K, V>Map 常用方法 Set常用方法 集合框架 Vector 一个古老的集合类&#xff0c;实现了…

【EI会议征稿】第四届机械设计与仿真国际学术会议(MDS 2024)

【高录用快检索】第四届机械设计与仿真国际学术会议&#xff08;MDS 2024) 2024 4th International Conference on Mechanical Design and Simulation 2024年第四届机械设计与仿真国际学术会议&#xff08;MDS 2024) 将于2024年03月01-03日在中国西安召开。MDS 2024将围绕“…

C# NAudio 音频库

C# NAudio 音频库 NAudio安装NAudio简述简单示例1 NAudio安装 项目>NuGet包管理器 搜索NAudio点击安装&#xff0c;自动安装依赖库。 安装成功后工具箱会新增NAudio.WinForms控件 NAudio简述 NAudio为.NET平台下的开源库&#xff0c;采用ML-PL协议&#xff0c;开源地址…

雷达模糊函数及MATLAB仿真

文章目录 前言一、雷达模糊函数二、Matlab 仿真1、单脉冲模糊函数①、MATLAB 源码②、仿真结果1&#xff09;不确定函数三维图2&#xff09;不确定函数的等高图3&#xff09;模糊函数的三维图4&#xff09;模糊函数的等高图 2、单脉冲多普勒频率轴上的切面①、MATLAB 源码②、仿…

srs webrtc推拉流环境搭建(公网)

本地环境搭建 官方代码https://github.com/ossrs/srs 拉取代码&#xff1a; git clone https://github.com/ossrs/srs.gitcd ./configure make ./objs/srs -c conf/https.rtc.confsrs在公网上&#xff0c;由于srs是lite-ice端&#xff0c;导致他不会主动到srs获取自己的公网i…

【python】OpenCV—Rectangle, Circle, Selective Search(1.2)

文章目录 1 画框画圈1.1 画矩形框1.2 画圆 / 点1.3 椭圆 2 Selective Search3 Resize 1 画框画圈 1.1 画矩形框 # Copy the image img_rgb_copy img_rgb.copy()# Draw a rectangle cv2.rectangle(img_rgb_copy, pt1 (405, 90), pt2 (740, 510),color (255, 0, 0), thickne…