C++ std::move()-它对本机数据类型有什么好处?

C++ std::move()-它对本机数据类型有什么好处?,c++,C++,std::move()对本机类型或本机指针有影响吗?如果没有,那么对于向量,即使没有自定义移动构造函数,它如何在内部使临时内置类型无效?std::move()对本机类型或本机指针有影响吗 不,对于本机类型或本机指针,它们只是一个副本,您可以通过查看来验证,对于整数类型或指针,优化的反汇编是一条指令,它们不能比副本快 那么对于向量,它如何在内部使临时内置类型无效呢 首先,std::move只是强制转换,它不移动任何东西。libstdc++的 模板 _GLIBCXX_NODISCARD cons

std::move()
对本机类型或本机指针有影响吗?如果没有,那么对于向量,即使没有自定义移动构造函数,它如何在内部使临时内置类型无效?

std::move()对本机类型或本机指针有影响吗


不,对于本机类型或本机指针,它们只是一个副本,您可以通过查看来验证,对于整数类型或指针,优化的反汇编是一条指令,它们不能比副本快

那么对于向量,它如何在内部使临时内置类型无效呢


首先,
std::move
只是强制转换,它不移动任何东西。libstdc++的

模板
_GLIBCXX_NODISCARD
constexpr typename std::remove_reference::type&&
移动(&&t)不例外
{return static_cast(__t);}
然后对于std::vector的实现,有点像这样,有3个数据成员,它们都是指针<代码>\u M_start指向用户数据开始地址的指针,
\u M_finish
指向用户数据结束地址的指针

模板
类向量{
typedef typename__gnu_cxx::_alloc_traits::template
重新绑定:其他类型;
typedef typename__gnu_cxx::_alloc_traits::指针
指针;
指针启动;
指针完成;
存储器的指针端;
};
对于
移动构造函数
,它将如下所示:

Vector(Vector&&ux)无例外
:u M_开始(u x.u M_开始),u M_完成(u x.u M_完成),
_存储的M_end_(_x._M_end_存储的M_end_)
{uuuux.\u M_start=\uuuux.\u M_finish=\uuuux.\u M_end_of_storage=pointer();}
这里只发生指针赋值,因此它比c++11之前的版本快得多,此时我们只能从源向量复制所有元素并销毁旧向量,您可以通过检查libstdc的++

      vector(const vector& __x)
      :
      {
          this->_M_finish =
              std::__uninitialized_copy_a(__x.begin(), __x.end(),
                      this->._M_start,
                      this->get_allocator());
      }

对于其他STL容器,如
deque
map
,它们都类似于
vector

那么什么时候
std::move
有用呢?当您的类数据成员分配堆内存或使用STL容器时。或者以间接方式:数据成员或基类受益于
移动构造函数
移动赋值运算符
,那么您的类将受益于它

要了解有关移动构造函数和移动赋值运算符的详细信息,请执行以下操作:

“向量如何在内部使临时内置类型对象无效”您能解释一下您在这里的意思吗?向量如何在内部实现移动构造函数?它不涉及任何类型的临时对象。@sumitkumar您的编译器的向量实现可供您自由查看,但简而言之,向量包含指向数组的指针。向量的move构造函数只是将指针从源向量移动到新向量,然后将源向量中的指针置零。还要注意的是,
std::move
只是一个强制转换,本身不做任何事情