减少持久数据结构中的shared_ptrs数

Reduce number of shared_ptrs in persistent data structure

本文关键字:shared ptrs 数据结构      更新时间:2023-10-16

我面临着单向链表类的设计选择。粗略的想法是这样的:

template<typename T>
class List {
public:
    ...
private:
    struct Node {
        std::shared_ptr<const T> value;
        std::shared_ptr<const Node> next;
    };
    std::shared_ptr<const Node> node_;
};

是的,我知道有很多shared_ptr在四处游荡,但那是因为它List是一个功能性的持久数据结构,需要尽可能多的结构共享。例如,在此实现中,反转列表不需要复制任何元素,并且多个列表可以共享一个公共子列表(通过指向同一个shared_ptr尾)。

话虽如此,我仍然觉得shared_ptr可能太多了。有没有办法减少使用的shared_ptr数量,同时仍然启用结构共享?就像在Node内组合两个shared_ptr以减少控制块的开销一样......我不知道,也许没有办法,也许有。欢迎任何想法,即使是完全重新设计List类。

您希望共享没有结构的数据(相反的情况)。

您想共享结构。

两者都需要共享指针。 但是,如果要减少控制块开销,只要纠缠生命周期,就可以执行此操作。

您可以将 T 的生存期与其节点相关联。 然后,反向节点还需要使原始节点持久化。 这可能会导致结构超出其需求,但使纯正向案例更便宜。

使指向 T 的指针成为原始指针。

创建一个包含 T 和节点的组合结构。

使用make_shared创建它。

现在,在组合结构中的 T 处将指向 T 的指针指向 T。

接下来,使用别名 ctor 为共享组合结构的控制块的节点创建共享 ptr。

若要反转,请创建一个帮助程序结构,其中包含一个节点和一个共享的 ptr 到节点。 使共享成为帮助程序。 将共享节点 ptr 指向正向节点,将 T ptr 指向正向节点中的 T ptr,然后使用共享 ptr 的别名 ctor 获取共享 ptr 到节点。

我认为这是不值得的。