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

时间:2016-07-09 10:32:57

标签: c++ c++11 c++14

我面临单一链接列表类的设计选择。粗略的想法是:

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的使用数量,同时仍然支持结构共享?有点像在shared_ptr中组合两个Node来减少控制块的开销......我不知道,也许没有办法,或者可能没有。任何想法都是受欢迎的,甚至是完全重新设计List课程。

1 个答案:

答案 0 :(得分:2)

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

您想要分享结构。

两者都需要共享指针。但是,如果你想减少控制块开销,只要你纠缠生命周期就可以做到这一点。

您可以将T&#39的生命周期与其节点绑定。然后,反向节点还需要使原始节点保持不变。这可能导致结构比其需求更长,但使纯粹的前提案件更便宜。

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

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

使用make_shared创建它。

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

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

要反转,请创建一个带有Node的helper结构和一个到Node的共享ptr。分享帮助。将共享节点ptr指向前向节点,将T ptr指向前向节点中的T ptr,然后使用共享ptr的别名ctor获取到节点的共享ptr。

我认为这不值得。