C++中std::move与std::move_backward的区别在哪里?🤔

2026-05-30 14:563阅读0评论建站教程
  • 内容介绍
  • 文章标签
  • 相关推荐

在C++的算法库中,std::move 和 std::move_backward 是两个经常被搞混的函数。它们都和“移动语义”有关,但你真的知道它们的区别吗?别急, 我们今天就来聊聊这个话题,而且我会尽量把它讲得像一个真实的人在跟你聊天而不是那种教科书式的干巴巴解释,白嫖。。

先说点基础:什么是移动语义?

在C++11之前,对象的复制是通过拷贝构造函数完成的。比如你有一个字符串, 你要把它赋值给另一个变量, 反思一下。 那系统就会给你重新分配内存,然后把数据从一个地方复制到另一个地方。这在数据量大的时候,效率就很低。

C++11 std::move与std::move_backward深度解析

性价比超高。 然后C++11来了带来了“移动语义”。简单就是把资源“偷”过来而不是复制。比如你有一个字符串,你把它“移动”给另一个变量,那原来的字符串就变成空的了但新变量拿到了所有资源。这就像你把你的银行卡余额转给了别人,你自己卡里就空了但别人拿到了钱。这就是移动语义的精髓。

std::move:不是移动, 是“允许移动”

很多人以为std::move就是“移动”数据,其实不是。它只是告诉编译器:“嘿,这个对象可以被移动了你看着办吧。”,不错。

它本身不移动任何东西, 它只是把一个左值转换成右值引用,让编译器知道这个对象可以被“偷走”了。 来日方长。 真正的移动操作,是靠对象的移动构造函数或移动赋值运算符来完成的。

比如:

std::string s1 = "hello";
std::string s2 = std::move; // s1现在处于未定义状态

原来小丑是我。 这段代码施行后 s2拿到了s1的资源,s1就变成了一个“空壳”。所以移动之后你不能再使用s1了除非你知道你在做什么。

std::move_backward:反向移动的守护者

对吧? 现在我们来聊聊std::move_backward。

阅读全文

在C++的算法库中,std::move 和 std::move_backward 是两个经常被搞混的函数。它们都和“移动语义”有关,但你真的知道它们的区别吗?别急, 我们今天就来聊聊这个话题,而且我会尽量把它讲得像一个真实的人在跟你聊天而不是那种教科书式的干巴巴解释,白嫖。。

先说点基础:什么是移动语义?

在C++11之前,对象的复制是通过拷贝构造函数完成的。比如你有一个字符串, 你要把它赋值给另一个变量, 反思一下。 那系统就会给你重新分配内存,然后把数据从一个地方复制到另一个地方。这在数据量大的时候,效率就很低。

C++11 std::move与std::move_backward深度解析

性价比超高。 然后C++11来了带来了“移动语义”。简单就是把资源“偷”过来而不是复制。比如你有一个字符串,你把它“移动”给另一个变量,那原来的字符串就变成空的了但新变量拿到了所有资源。这就像你把你的银行卡余额转给了别人,你自己卡里就空了但别人拿到了钱。这就是移动语义的精髓。

std::move:不是移动, 是“允许移动”

很多人以为std::move就是“移动”数据,其实不是。它只是告诉编译器:“嘿,这个对象可以被移动了你看着办吧。”,不错。

它本身不移动任何东西, 它只是把一个左值转换成右值引用,让编译器知道这个对象可以被“偷走”了。 来日方长。 真正的移动操作,是靠对象的移动构造函数或移动赋值运算符来完成的。

比如:

std::string s1 = "hello";
std::string s2 = std::move; // s1现在处于未定义状态

原来小丑是我。 这段代码施行后 s2拿到了s1的资源,s1就变成了一个“空壳”。所以移动之后你不能再使用s1了除非你知道你在做什么。

std::move_backward:反向移动的守护者

对吧? 现在我们来聊聊std::move_backward。

阅读全文