gpt4 book ai didi

c++11 - std::vector.push_back(std::move(foo)) 有意义吗?

转载 作者:行者123 更新时间:2023-12-04 23:13:14 29 4
gpt4 key购买 nike

我在一些代码中遇到过这个问题(为了清楚起见,细节被删除了):

std::vector<std::vector<int>> foo;
{
std::vector<int> bar = {42};
foo.push_back(std::move(bar)); // Hmmm...
} // Indicate `bar` is no longer needed.
std::move 对我来说看起来没有必要,但是是吗?行为与 foo.push_back(bar); 有什么不同吗?如果元素不是 int,而是像 pcl::PointXYZ 这样的类,因为它在我的实际代码中会怎样?

更新 :我修改了代码以更明确地表明在 bar 之后不使用 std::move ,因此没有非法访问等风险。

最佳答案

vector 类有两个 push_back 实现:

void push_back( const T& value );
void push_back( T&& value );

第一个复制给定的元素。

第二个尝试通过调用元素的 move 构造函数(如果已定义)来“move ”它。

使用 move 强制选择第二个实现,该实现应该重用该值,而不仅仅是复制一个。

在这种特殊情况下,这就是会发生的事情:
  • 向量 bar 分配在堆栈上,但其元素 (42) 分配在堆上。
  • 当你调用 foo.push_back(...) 时,foo 在堆上分配一个新的向量,这将是 bar 的副本。让我们称之为 baz :) 根据调用的 push_back 实现,将发生以下情况:
  • void push_back( const T& value ); :在这种情况下,所有 bar 的元素也将被复制到 baz
  • void push_back( T&& value ); 在这种情况下 baz 将接收一个指向 bar 元素的指针,因此不执行复制操作。但是对于理解 bar 将被剥夺其元素(现在 baz 拥有它们)至关重要,因此 bar 不应在 move 之后使用。

  • 元素的类型(普通整数或 pcl::PointXYZ )并不重要,因为只有第一个向量为元素分配了内存,并且指向该内存的指针是在 move 调用期间唯一复制的内容。

    关于c++11 - std::vector.push_back(std::move(foo)) 有意义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50227213/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com