为我自己实现移动语义 std::vector
Implement move semantics for my own std::vector
如何在给定内部字段数据、大小和容量的情况下为 std::vector 实施移动示意图?
我怎样才能使这个线程安全?
#include <utility>
class vec {
public:
vec(vec&& o) : size(o.size), capacity(o.capacity), data(std::move(o.data))
{}
vec& operator=(vec&& o)
{
if (this != &o) {
size = o.size;
capacity = o.capacity;
delete[] data;
data = o.data;
o.data = nullptr;
}
return *this;
}
vec(vec&) = delete; // disable copying
vec& operator=(vec&) = delete;
vec& operator=(vec&) const = delete;
int* data;
size_t size;
size_t capacity;
};
几点:
- 我认为您不会在原始指针上使用
std::move
。你只会
使用 data = o.data
分配指针,然后手动将旧指针设置为空 o.data = nullptr
。
- 根据定义,如果你正在移动一个对象,你就假设没有其他线程会使用你正在移动的对象,否则你不应该移动它,因此你不会在移动赋值运算符,您将确保其余代码中的线程安全。
如何在给定内部字段数据、大小和容量的情况下为 std::vector 实施移动示意图? 我怎样才能使这个线程安全?
#include <utility>
class vec {
public:
vec(vec&& o) : size(o.size), capacity(o.capacity), data(std::move(o.data))
{}
vec& operator=(vec&& o)
{
if (this != &o) {
size = o.size;
capacity = o.capacity;
delete[] data;
data = o.data;
o.data = nullptr;
}
return *this;
}
vec(vec&) = delete; // disable copying
vec& operator=(vec&) = delete;
vec& operator=(vec&) const = delete;
int* data;
size_t size;
size_t capacity;
};
几点:
- 我认为您不会在原始指针上使用
std::move
。你只会 使用data = o.data
分配指针,然后手动将旧指针设置为空o.data = nullptr
。 - 根据定义,如果你正在移动一个对象,你就假设没有其他线程会使用你正在移动的对象,否则你不应该移动它,因此你不会在移动赋值运算符,您将确保其余代码中的线程安全。