rValue use - c++ 11

rValue use - c++ 11

本文关键字:c++ use rValue      更新时间:2023-10-16

我正在通过他的创造者的书学习c ++,我知道rValue基本上是无法通过它的地址定义的,你想移动它而不是复制。

在本书的后面,Stroustrup给出了一个Points结构的例子

struct Point{
  int x,y;
}
struct Points{
  vector<Point> elem;
  Points(Point p0){elem.push_back(p0)};
  ...
}
Point x2{ {100,200} }

所以我的问题基本上是为什么在构造函数中它不使用 rValue 来移动发送的值?

也许像:

struct Points{
  vector<Point> elem;
  Points(Point&& p0){elem.push_back(p0)};
  ...
}

这样做更合适/不太清楚吗?

问候

当移动比复制便宜时,移动值特别有用。碰巧的是,复制int非常便宜。您的 CPU 将一直执行此操作,因为它将值从内存加载到寄存器或在寄存器之间加载。因此,对于int移动与复制相同。

您的Point是两个整数,并且相同的逻辑仍然成立。但vector<Point>是另一回事。你会发现sizeof(Points)是一个很小的数字。那是因为它不包括 sizeof(Point)*elem.size() ,一个在运行时可能会变化的数量。这就是搬家变得有益的地方。移动该向量会移动sizeof(Point)*elem.size()

"它不使用 rValue"到底是什么意思?您的意思是p0不是作为右值"发送"的,还是意味着对push_back的调用不使用右值?

  1. Point&& p0是用右值初始化的 - 到目前为止一切顺利。
  2. push_back (p0)复制一个左值,你可能想做的是:push_back (std::move (p0)) .

您可以使用一个很好的助记符来区分左值和右值:

每当

对象有一个名称时,它就是一个左值,每当 对象没有名称,它是一个右值。

例如: call_to_some_function (std::string {"Hi there"});,这里传递给函数的字符串没有名称,它是一个右值。这同样适用于所有临时人员。

 void some_function (std::string&& what)
 {
       do_something_with (what); // <- what is an lvalue
       do_something_else (std::move (what)); // <- turned into rvalue
       const std::string& foo = get_some_foo_string ();
       do_something_else (std::move (foo)); // <- No rvalue here!
 }