交换两个复杂结构的最快方法是什么?

时间:2019-02-26 13:26:21

标签: c++ c++11

我需要将一个结构的值与另一个结构交换,并认为交换将比复制更快-是吗?

#include <iostream>
#include <algorithm>
#include <vector>

class B
{
 public:
  int y;
  std::vector<int> z;
  B(){std::cout << "Called" << std::endl;}
 private:
 int z1;
};

int main()
{
 B b1, b2;
 b1.z.push_back(1);
 std::swap(b1,b2);
 std::cout << b2.z[0] << std::endl;
 b1.z.push_back(1);
 b2 = std::move(b1);
 std::cout << b2.z[0] << std::endl;
 b1.z.push_back(1);
 std::exchange(b1, b2);
 std::cout << b2.z[0] << std::endl;
 b1.z.push_back(1);
 b2 = std::forward<B>(b1);
 std::cout << b2.z[0] << std::endl;
}

上面的代码按预期进行了交换,但是我不确定这是最快的方法。我的目标是将一个结构变量的值(如果比较快则交换)复制到另一个。在实际代码中,结构将具有复杂的用户定义类型。

我知道类似的方式也可以复制-但是哪种方式最好/最安全/最快地复制到目的地?

我需要照顾一些操作员/构造函数吗?

2 个答案:

答案 0 :(得分:2)

给予

  1. 允许编译器为../../../生成 move构造函数(研究 5的规则),这是一个逐级移动构造主题遵守假设规则

  2. B使用move构造函数

  3. std::move使用std::swap

  4. std::move具有移动构造函数

,只需使用

std::vector

很难

答案 1 :(得分:1)

  

我知道类似的方式也可以复制-但是哪种方式最好/最安全/最快地复制到目的地?

只要您的类型是可移动的,

std::swap实际上就不会复制。最简单的形式是

template<typename T>
void swap(T& lhs, T& rhs)
{
    T tmp{std::move(rhs)};
    rhs = std::move(lhs);
    lhs = std::move(tmp);
}

因此,只要移动对象比复制对象快,那么交换将更快。如果没有,那么它们将具有相同的性能。