gpt4 book ai didi

c++ - 寻找一个智能指针,它会在复制智能指针本身时复制底层资源

转载 作者:搜寻专家 更新时间:2023-10-31 01:34:45 26 4
gpt4 key购买 nike

动机

假设有一个很大的类A ,我想把它存储在一个 vector 中,我也希望这个 vector 是可复制的。因此,像 std::shared_ptr 这样的智能指针和 std::unique_ptr不会是好的选择。我知道我可以存储 A 的对象在std::vector<A>直接地。但正如我所说,A是一个非常大的类。由于 std::vector<A> 的元素连续驻留在内存中,很有可能std::vector<A>如果我经常更新它需要重新分配内存。所以,我需要一个“智能指针”(比如说 copyable_ptr ),它将在复制智能指针本身时复制底层资源。然后我可以使用 std::vector<copyable_ptr<A>>管理 A 的对象.

这是copyable_ptr的片段模板类:

template <typename T> class copyable_ptr {
public:
explicit copyable_ptr(T *p) : p(p) {}
copyable_ptr(copyable_ptr const &rhs) : p(new T(*rhs.p)) {}
copyable_ptr(copyable_ptr &&rhs) : p(rhs.p) { rhs.p = nullptr; }
~copyable_ptr() { delete p; }
copyable_ptr &operator=(copyable_ptr rhs) {
swap(rhs);
return *this;
}
void swap(copyable_ptr &rhs) {
using std::swap;
swap(p, rhs.p);
}
T &operator*() const { return *p; }
T *operator->() const { return &this->operator*(); }

/* other members */

private:
T *p;
};

template <typename T>
inline void swap(copyable_ptr<T> &lhs, copyable_ptr<T> &rhs) {
lhs.swap(rhs);
}

问题

是否有我可以直接使用的类似类,或者我应该编写自己的类,还是有任何其他合适的解决方案来将大类存储在容器中?

编辑

我想我应该更清楚地解释一下自己。 A是一个很大的类(class),我想用 std::vector管理 A 的对象.基本上,有四种选择可以完成这项工作:

std::vector<std::shared_ptr<A>> a1;    // #1
std::vector<std::unique_ptr<A>> a2; // #2
std::vector<A *> a3; // #3
std::vector<A> a4; // #4

我不想共享 A 的对象,这使得#1 不合适。 vector 在#2 中不可复制,我必须手动处理内存管理在#3。所以,只剩下#4了。

但是,我不喜欢#4 的地方是 a4 的大小。达到其容量,重新分配发生。 a4 的两倍大小将被保留(正如我所说,A 是一个非常大的类,在堆中保留这么多连续内存只是为了潜在的使用是不是不合适?)。更糟糕的是,我们可能需要移动 a4 的每一个元素。从旧内存位置到新分配的内存。当我问这个问题时,我忘记提及的 #4 的另一个倒退是它不是多态支持。

所以,如果我使用 std::vector<copyable_ptr<A>>管理 A 的对象,我上面提到的所有问题似乎都得到了妥善处理。您所需要的只是一个精心设计的 copyable_ptr类,这就是我要找的。

最佳答案

是的,有这样一种东西:它叫做类本身。

智能指针的全部目的是为对象提供引用计数句柄,可以传递,无需复制底层对象,并在引用计数下降到 0 时自动销毁对象,并且引用对象的最后一个智能指针超出范围,它被销毁(shared_ptrunique_ptr 等之间引用计数语义的某些变体)。

如果你想要某种指向复制它的对象的指针,那么在复制指针时,你不需要指针。只需按值直接使用该对象。根据定义,每次复制它时,都保证复制该对象。

拥有某种指针,绝对不会增加任何值(value)。你想直接使用这个对象,需要的时候复制它,等等......就用这个对象。

关于c++ - 寻找一个智能指针,它会在复制智能指针本身时复制底层资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38690406/

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