我需要将一个结构的值与另一个结构交换,并认为交换将比复制更快-是吗?
#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;
}
上面的代码按预期进行了交换,但是我不确定这是最快的方法。我的目标是将一个结构变量的值(如果比较快则交换)复制到另一个。在实际代码中,结构将具有复杂的用户定义类型。
我知道类似的方式也可以复制-但是哪种方式最好/最安全/最快地复制到目的地?
我需要照顾一些操作员/构造函数吗?
答案 0 :(得分:2)
给予
允许编译器为../../../
生成 move构造函数(研究 5的规则),这是一个逐级移动构造主题遵守假设规则
B
使用move构造函数
std::move
使用std::swap
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);
}
因此,只要移动对象比复制对象快,那么交换将更快。如果没有,那么它们将具有相同的性能。