gpt4 book ai didi

c++ - std::move 的用法

转载 作者:行者123 更新时间:2023-12-01 14:18:15 28 4
gpt4 key购买 nike

问题下方是 SO 代码的简化版本。原代码:

  • 接收不应修改或无效的结构
  • 创建一个不同的结构,其中包含从原始结构复制的一些数据
  • 新创建的结构是不可修改的,所有成员都是const
  • 新创建的结构不能有知道原结构的构造函数

SO 的简化代码没有原来的结构,我只是用循环组成数据。然而,仍然重要的细节是新结构的构造函数将传递 std::vector。这些在循环中填充并 move 到新结构

我突然想到,在创建新结构后将不再需要 std::vector,因此 std::move 将是合适的。我在下面的代码中将用法标记为“move 1”、“move 2”、“move 3”和“move 4”:

#include <iostream>
#include <vector>

struct A {
const int m_a;

A() = delete;
A(const int a_a) : m_a(a_a) {}

void display() const { std::cout << " " << m_a << "\n"; }
};

struct B {
const std::vector<A> m_as;
const int m_b;

B() = delete;
B(
std::vector<A>&& a_as,
const int a_b
) :
m_as(std::move(a_as)), // Move 1
m_b(a_b)
{}

void display() const {
std::cout << " " << m_b << ":\n";
for (const A& a : m_as)
a.display();
}
};

struct C {
const std::vector<B> m_bs1;
const std::vector<B> m_bs2;

C() = delete;
C(
std::vector<B>&& a_bs1,
std::vector<B>&& a_bs2
) :
m_bs1(std::move(a_bs1)), // Move 2
m_bs2(std::move(a_bs2)) // Move 2
{}

void display() const {
std::cout << "0:\n";
for (const B& b : m_bs1)
b.display();
std::cout << "1:\n";
for (const B& b : m_bs2)
b.display();
}
};

int main() {
// Manually making up data, actual usage will take data from a different
// kind of structure and populate vectors
std::vector<B> bs1, bs2;
for (int i = 0; i < 3; ++i) {
std::vector<A> as;
for (int j = 0; j < 2; ++j)
as.emplace_back(j);
bs1.emplace_back(std::move(as), i); // Move 3
}
for (int i = 0; i < 3; ++i) {
std::vector<A> as;
for (int j = 0; j < 2; ++j)
as.emplace_back(j);
bs2.emplace_back(std::move(as), i); // Move 3
}

C c(std::move(bs1), std::move(bs2)); // Move 4
c.display();
return 0;
}

一些假设:

  • 我认为“move 1”和“move 2”之间没有显着差异
  • 我认为“第 3 步”和“第 4 步”之间没有显着差异
  • 据我所知,std::forward 不能很好地替代任何 std::move 用法,因为没有模板

问题:std::move 的所有用法都是有意义的还是没有必要?

最佳答案

您可以看到大部分 std::move 都是必需的,只需删除它们,您的代码将无法编译。唯一的异常(exception)是 Move 1Move 2,代码在没有它们的情况下仍然可以编译,但这只是因为调用了 std::vector 复制构造函数相反。

如果您想从一个对象中 move ,您几乎总是需要使用 std::move,唯一的异常(exception)是从临时对象中 move 和返回对象时。

关于c++ - std::move 的用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62889393/

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