如何正确运用C++中的std::move()函数?

更新于
2026-07-30 16:23:37
21阅读来源:SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计450个文字,预计阅读时间需要2分钟。

如何正确运用C++中的std::move()函数?

std::move 函数可以将左值引用转换为右值引用。它以一个非常简单的方式将左值转换为右值引用,从而避免了不必要的复制操作。

如何正确运用C++中的std::move()函数?

通过使用 std::move,可以减少不必要的拷贝,提高性能。std::move 是为了性能而生的。

std::move 实际上是将对象的状态或所有权转移到右值引用,而不是创建一个对象的副本。


std::move函数可以以非常简单的方式将左值引用转换为右值引用。

​​通过std::move,可以避免不必要的拷贝操作。​​​​std::move是为性能而生。​​
​​std::move是将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存的搬迁或者内存拷贝。​​

如string类在赋值或者拷贝构造函数中会声明char数组来存放数据,然后把原string中的 char 数组被析构函数释放,如果str是一个临时变量,则上面的拷贝,析构就是多余的,完全可以把临时变量str中的数据直接 “转移” 到新的变量下面即可。

#include <iostream>
#include <utility>
#include <vector>
#include <string>
int main()
{
std::string str = "Hello";
std::vector<std::string> v;
//调用常规的拷贝构造函数,新建字符数组,拷贝数据
v.push_back(str);
std::cout << "After copy, str is \"" << str << "\"\n";
//调用移动构造函数,掏空str,掏空后,最好不要使用str
v.push_back(std::move(str));
std::cout << "After move, str is \"" << str << "\"\n";
std::cout << "The contents of the vector are \"" << v[0]
<< "\", \"" << v[1] << "\"\n";

getchar();
return 0;
}

输出:

After copy, str is "Hello"
After move, str is ""
The contents of the vector are "Hello", "Hello"

结论: 明显看出,在move之前str是有值的,在move之后,str里的值为空了!


本文共计450个文字,预计阅读时间需要2分钟。

如何正确运用C++中的std::move()函数?

std::move 函数可以将左值引用转换为右值引用。它以一个非常简单的方式将左值转换为右值引用,从而避免了不必要的复制操作。

如何正确运用C++中的std::move()函数?

通过使用 std::move,可以减少不必要的拷贝,提高性能。std::move 是为了性能而生的。

std::move 实际上是将对象的状态或所有权转移到右值引用,而不是创建一个对象的副本。


std::move函数可以以非常简单的方式将左值引用转换为右值引用。

​​通过std::move,可以避免不必要的拷贝操作。​​​​std::move是为性能而生。​​
​​std::move是将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存的搬迁或者内存拷贝。​​

如string类在赋值或者拷贝构造函数中会声明char数组来存放数据,然后把原string中的 char 数组被析构函数释放,如果str是一个临时变量,则上面的拷贝,析构就是多余的,完全可以把临时变量str中的数据直接 “转移” 到新的变量下面即可。

#include <iostream>
#include <utility>
#include <vector>
#include <string>
int main()
{
std::string str = "Hello";
std::vector<std::string> v;
//调用常规的拷贝构造函数,新建字符数组,拷贝数据
v.push_back(str);
std::cout << "After copy, str is \"" << str << "\"\n";
//调用移动构造函数,掏空str,掏空后,最好不要使用str
v.push_back(std::move(str));
std::cout << "After move, str is \"" << str << "\"\n";
std::cout << "The contents of the vector are \"" << v[0]
<< "\", \"" << v[1] << "\"\n";

getchar();
return 0;
}

输出:

After copy, str is "Hello"
After move, str is ""
The contents of the vector are "Hello", "Hello"

结论: 明显看出,在move之前str是有值的,在move之后,str里的值为空了!