投射物体时复制与移动
Copying vs Moving while casting objects
我正在尝试为线性代数列向量实现 class。我有以下代码片段,我尝试在不复制任何内容的情况下转换对象。
#include <iostream>
#include <fstream>
#include <cassert>
#include <vector>
using namespace std;
class Vector
{
public:
std::vector<int> vect;
public:
Vector() = default;
Vector(const Vector& v):vect(v.vect){ };
Vector(Vector&& v)
{
vect.swap(v.vect);
}
Vector(const std::vector<int>& v)
{
vect = v;
}
Vector(std::vector<int>&& v)
{
vect.swap(v);
}
auto begin()
{
return vect.begin();
}
auto end()
{
return vect.end();
}
};
class ColumnVector: public Vector
{
public:
ColumnVector() = default;
ColumnVector(const ColumnVector& v)
{
this->vect = v.vect;
}
ColumnVector(ColumnVector&& v)
{
this->vect.swap(v.vect);
}
ColumnVector(Vector&& v)
{
this->vect.swap(v.vect);
}
};
int main()
{
Vector v(vector<int>({ 1, 2, 3, 4, 5 }));
ColumnVector cv = ( ColumnVector&& )v;
for ( auto it = v.begin(); it != v.end(); it++ )
cout << *it << " ";
// nothing printed -- seems that data have been moved
for ( auto it = cv.begin(); it != cv.end(); it++ )
cout << *it << " ";
// 1 2 3 4 5
}
我尝试在不进行任何复制的情况下投射对象。速度是必不可少的,所以我想知道我是否做对了。另外,伙计们,你们有什么优化技巧可以用于这个代码片段吗?
决赛:
我决定使用 std::move
,它尽可能快地完成工作。
您不需要编写复制和移动构造函数,因为如果唯一的行为是 copy/move std::vector
成员,编译器将隐式生成它们。
顺便说一下,您可能希望将 ColumnVector
实现为 Vector
的视图(类似于 std::string_view
),这样甚至没有移动。
我正在尝试为线性代数列向量实现 class。我有以下代码片段,我尝试在不复制任何内容的情况下转换对象。
#include <iostream>
#include <fstream>
#include <cassert>
#include <vector>
using namespace std;
class Vector
{
public:
std::vector<int> vect;
public:
Vector() = default;
Vector(const Vector& v):vect(v.vect){ };
Vector(Vector&& v)
{
vect.swap(v.vect);
}
Vector(const std::vector<int>& v)
{
vect = v;
}
Vector(std::vector<int>&& v)
{
vect.swap(v);
}
auto begin()
{
return vect.begin();
}
auto end()
{
return vect.end();
}
};
class ColumnVector: public Vector
{
public:
ColumnVector() = default;
ColumnVector(const ColumnVector& v)
{
this->vect = v.vect;
}
ColumnVector(ColumnVector&& v)
{
this->vect.swap(v.vect);
}
ColumnVector(Vector&& v)
{
this->vect.swap(v.vect);
}
};
int main()
{
Vector v(vector<int>({ 1, 2, 3, 4, 5 }));
ColumnVector cv = ( ColumnVector&& )v;
for ( auto it = v.begin(); it != v.end(); it++ )
cout << *it << " ";
// nothing printed -- seems that data have been moved
for ( auto it = cv.begin(); it != cv.end(); it++ )
cout << *it << " ";
// 1 2 3 4 5
}
我尝试在不进行任何复制的情况下投射对象。速度是必不可少的,所以我想知道我是否做对了。另外,伙计们,你们有什么优化技巧可以用于这个代码片段吗?
决赛:
我决定使用 std::move
,它尽可能快地完成工作。
您不需要编写复制和移动构造函数,因为如果唯一的行为是 copy/move std::vector
成员,编译器将隐式生成它们。
顺便说一下,您可能希望将 ColumnVector
实现为 Vector
的视图(类似于 std::string_view
),这样甚至没有移动。