C++进阶之右值引用std::move:用法实例(四百零六)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者

新书发布:《Android系统多媒体进阶实战》🚀
优质专栏: Audio工程师进阶系列原创干货持续更新中……】🚀
优质专栏: 多媒体系统工程师系列原创干货持续更新中……】🚀
优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门视频实战课 🚀

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

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

欢迎关注Android系统攻城狮

🌻1. 前言

本篇目的:C++进阶之右值引用std::move:用法实例

🌻2. C++之std::move介绍

  1. 基本概念
    std::move 是 C++11 引入的标准库函数模板,定义于 <utility> 头文件中。它的作用是将一个左值强制转换为右值引用,从而触发移动语义。

  2. 功能
    std::move 不进行任何实际的“移动”操作,只是类型转换工具。其主要用途是在对象赋值或构造时,启用移动构造函数或移动赋值运算符,避免昂贵的深拷贝。

  3. 使用限制
    被 std::move 修饰的对象之后状态未定义,仅适用于临时资源转移场景。需谨慎使用,避免对已移动对象进行后续访问。

  4. 与 std::forward 区别
    std::move 适用于已知将要移动的值,而 std::forward 适用于完美转发函数模板中保持参数值类别。

  5. 性能特性
    通过移动语义可显著提升资源密集型对象(如 std::vector、std::string、文件流等)的传递效率,避免不必要的复制构造。

  6. 使用场景
    适用于返回局部对象、容器插入优化、函数参数转移、手动控制资源所有权转移等情况。

🌻3. 代码实例

🐓3.1 移动 std::string 避免深拷贝

  1. 应用场景
    将大型字符串从一个变量转移到另一个,避免复制过程。

  2. 通用语法

std::string target = std::move(source);
  1. 用法实例
#include <iostream>
#include <string>
#include <utility>

int main() {
    std::string a = "hello world";
    std::string b = std::move(a);

    std::cout << "b: " << b << std::endl;
    std::cout << "a: " << a << std::endl;

    return 0;
}

输出:b = hello world,a 可能为空或未定义内容

🐓3.2 容器中移动元素插入

  1. 应用场景
    将临时对象高效插入 vector,避免复制构造。

  2. 通用语法

vec.push_back(std::move(obj));
  1. 用法实例
#include <iostream>
#include <vector>
#include <string>
#include <utility>

int main() {
    std::vector<std::string> names;
    std::string tmp = "Charlie";

    names.push_back(std::move(tmp));

    std::cout << "names[0]: " << names[0] << std::endl;
    std::cout << "tmp: " << tmp << std::endl;

    return 0;
}

输出:names[0] = Charlie,tmp 状态未定义或为空

🐓3.3 函数返回值中使用 std::move

  1. 应用场景
    函数中返回局部临时变量时,显式触发移动构造,提升性能。

  2. 通用语法

return std::move(obj);
  1. 用法实例
#include <iostream>
#include <vector>
#include <utility>

std::vector<int> getVector() {
    std::vector<int> v = {1, 2, 3, 4};
    return std::move(v);
}

int main() {
    std::vector<int> result = getVector();
    for (int n : result) std::cout << n << " ";
    std::cout << std::endl;
    return 0;
}

输出:1 2 3 4(避免 vector 拷贝构造)

🌻4. 用法总结

关键词功能描述典型应用
std::move 左值转右值引用启用移动语义,节省资源复制std::string、std::vector 等资源重绑定
std::move 容器插入优化减少 push_back 等操作的拷贝成本vector.emplace_back(std::move(obj))
std::move 函数返回优化避免返回值拷贝,提高函数效率return std::move(local_obj)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Android系统攻城狮

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值