0

我一直在迁移我的代码以使用 std::unique_ptr。

当我必须决定一个具有树层次结构的类时,我决定让对象拥有它们的孩子,这样从树中删除一个对象就会删除它。但是我注意到,在成千上万个元素的复杂层次结构中,破坏它真的很慢。就像,难以置信的慢。

那么是否只是建议不要嵌套唯一指针的向量,我应该切换到 unique_ptr 的平面布局,并在树中保留常规指针吗?我在想,这可能是一个众所周知的事实,这是不可行的,但这让我感到困惑,因为我很难找到关于这个具体细节的文献。

#include <vector>
#include <memory>

class Element
{
    std::vector<std::unique_ptr<Element>> mChildren;
};

更新:在犹豫是否要删除我的问题之后,我注意到我的问题与这个问题非常相似: 删除指针的 STL 向量条目的快速方法

此外,树结构的过程甚至更慢。unique_ptr毕竟这里似乎不负责任。

我写了一段代码来调查它

  • 销毁 60 000 个元素,unique_ptr平面布局大约需要 5 秒

  • 销毁 60 000 个元素,unique_ptr树布局大约需要 8 秒

如果没有 unique_ptr,时间只会稍微低一些。

所以我面临的实际问题是连续删除 60 000 个东西很慢。然后我想我的解决方案与链接问题中的解决方案相似:

  • 我知道我要批量删除的元素的池内存,但据说它非常麻烦并且容易出现严重错误

  • 让一个工作线程来做,它会保持缓慢但不会再阻碍主线程

我对如何正确执行两者在技术上不了解,但我想它会教育我。

4

0 回答 0