简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者
新书发布:《Android系统多媒体进阶实战》🚀
优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀
优质专栏: 多媒体系统工程师系列【原创干货持续更新中……】🚀
优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门视频实战课 🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
🍉🍉🍉文章目录🍉🍉🍉
🌻1. 前言
本篇目的:C++进阶之右值引用std::move:用法实例
🌻2. C++之std::move介绍
-
基本概念
std::move 是 C++11 引入的标准库函数模板,定义于<utility>
头文件中。它的作用是将一个左值强制转换为右值引用,从而触发移动语义。 -
功能
std::move 不进行任何实际的“移动”操作,只是类型转换工具。其主要用途是在对象赋值或构造时,启用移动构造函数或移动赋值运算符,避免昂贵的深拷贝。 -
使用限制
被 std::move 修饰的对象之后状态未定义,仅适用于临时资源转移场景。需谨慎使用,避免对已移动对象进行后续访问。 -
与 std::forward 区别
std::move 适用于已知将要移动的值,而 std::forward 适用于完美转发函数模板中保持参数值类别。 -
性能特性
通过移动语义可显著提升资源密集型对象(如 std::vector、std::string、文件流等)的传递效率,避免不必要的复制构造。 -
使用场景
适用于返回局部对象、容器插入优化、函数参数转移、手动控制资源所有权转移等情况。
🌻3. 代码实例
🐓3.1 移动 std::string 避免深拷贝
-
应用场景
将大型字符串从一个变量转移到另一个,避免复制过程。 -
通用语法
std::string target = std::move(source);
- 用法实例
#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 容器中移动元素插入
-
应用场景
将临时对象高效插入 vector,避免复制构造。 -
通用语法
vec.push_back(std::move(obj));
- 用法实例
#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
-
应用场景
函数中返回局部临时变量时,显式触发移动构造,提升性能。 -
通用语法
return std::move(obj);
- 用法实例
#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) |