当前位置: 首页 > news >正文

C++ 新特性 | C++ 11 | 移动语义

文章目录

      • **C++ 移动语义(通俗版)**
        • **1. 为什么需要移动语义?**
        • **2. 怎么“偷”?——右值引用(`&&`)**
        • **3. 如何实现移动语义?——移动构造函数/赋值**
        • **4. 什么时候触发移动?**
        • **5. 移动 vs 拷贝**
      • **一句话总结**

C++ 移动语义(通俗版)

1. 为什么需要移动语义?

传统拷贝(=)会复制整个对象,但如果对象很大(如 vector<string>),拷贝开销大。
移动语义的核心思想:“偷资源”,避免不必要的深拷贝,提升性能。


2. 怎么“偷”?——右值引用(&&
  • 右值(临时对象、字面量等) 的生命周期短,可以安全“偷”它的资源。
  • 右值引用 && 用来绑定右值,表示“这个值可以移动”。

示例:

std::string s1 = "Hello";
std::string s2 = std::move(s1);  // 把 s1 的资源“偷”给 s2
  • s1 变成空(资源被移动),s2 直接接管原内存,没有拷贝

3. 如何实现移动语义?——移动构造函数/赋值

类需要定义移动构造函数移动赋值运算符

class MyObject {
public:
    // 移动构造函数(参数是右值引用)
    MyObject(MyObject&& other) noexcept {
        data_ = other.data_;  // 直接“偷”指针
        other.data_ = nullptr;  // 原对象置空
    }

    // 移动赋值运算符
    MyObject& operator=(MyObject&& other) noexcept {
        if (this != &other) {
            delete data_;      // 释放自己的资源
            data_ = other.data_;  // “偷”对方的资源
            other.data_ = nullptr;
        }
        return *this;
    }

private:
    int* data_;  // 假设管理动态内存
};

关键点:

  • 直接“窃取”资源(如指针),避免深拷贝。
  • 把原对象的资源置空(防止重复释放)。

4. 什么时候触发移动?
  • 显式移动std::move(obj) 强制转成右值引用。
  • 隐式移动:函数返回临时对象时(编译器优化)。

示例:

std::vector<int> createBigVector() {
    std::vector<int> v = {1, 2, 3, 4, 5};
    return v;  // 编译器可能优化为移动(而非拷贝)
}

auto v = createBigVector();  // 移动构造,无拷贝

5. 移动 vs 拷贝
拷贝移动
操作深复制(完整备份)“偷”资源(直接接管)
开销高(内存、时间)低(仅指针交换)
原对象保持不变被置空(资源转移)

一句话总结

移动语义通过 &&std::move “偷”临时对象的资源,避免深拷贝,提升性能。
适用于管理动态内存的类(如 vectorstring、自定义资源类)。

相关文章:

  • 【huggingface 数据下载】ssh / https 不同的下载流程,hf 镜像下载注意事项
  • ⼆、Kafka客户端消息流转流程
  • Ubuntu环境安装
  • 【网安面经合集】42 道高频 Web 安全面试题全解析(附原理+防御+思路)
  • Java基础-25-继承-方法重写-子类构造器的特点-构造器this的调用
  • 基于langchain实现GraphRAG:基于图结构的检索增强生成系统
  • Linux(24)——系统调优
  • MySQL数据库和表的操作之数据库表操作
  • Day3 蓝桥杯省赛冲刺精炼刷题 —— 排序算法与贪心思维
  • 静态路由与BFD联动实验配置
  • TCP、HTTP、HTTPS、DNS的原理
  • 科技潮流出行新体验 方程豹全新车型钛3正式开启预售
  • linux服务器专题1------redis的安装及简单配置
  • 【跑步计划,日期推算】
  • 我的世界模组进阶开发教程——地形生成(2)
  • C语言基础数据类型
  • RAG 调优指南:Spring AI Alibaba 模块化 RAG 原理与使用
  • Linux进程间通信:【目的】【管道】【匿名管道】【命名管道】【System V 共享内存】
  • 自动驾驶浪潮下,HMI 设计如何保障安全与便捷?
  • PyTorch中知识蒸馏浅讲
  • 持续推动深入贯彻中央八项规定精神学习教育走深走实!上海市委党建工作领导小组会议举行
  • 中国社科院国际合作局副局长廖凡调任世界经济与政治研究所所长
  • 国家统计局督察组:江苏有关地区仍存在干预数据上报等问题
  • 阳朔兴坪镇:在建乾元桥“垮塌”是谣言,系降雨导致工程挡土墙倾斜
  • 前列腺癌真的难以早发现吗?如何治疗?专家回应
  • 顶刊论文现“飙脏话辱骂第二作者”,期刊回应:正积极调查