破坏std :: unique_ptr的树结构化向量

时间:2014-11-13 16:42:34

标签: c++ c++11 tree unique-ptr destruction

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

当我必须决定一个具有树层次结构的类时,我决定让对象拥有它们的子节点,这样从树中删除一个对象就会删除它。 但是我注意到,在数千个元素的复杂层次结构中,破坏它的速度非常慢。就像,令人难以置信的慢。

所以简单地建议不要嵌套唯一指针的向量,我应该切换到unique_ptr的平面布局,只是在树中保持常规指针? 我想象这可能是一个众所周知的事实,这是一个禁忌,但令我感到困惑,因为我很难找到关于这个具体细节的文献。

#include <vector>
#include <memory>

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

更新:经过长时间的犹豫是否删除我的问题,我注意到我的问题与此问题非常相似: fast way to delete entries of STL vector of pointers

另外,使用树结构进程更慢。毕竟,unique_ptr似乎没有责任。

我写了一段代码来调查它

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

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

如果没有unique_ptr,时间只会略微降低。

所以我面临的实际问题就是连续删除6万件事情的速度很慢。 然后我想我的解决方案与链接问题中的解决方案类似:

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

  • 让工作线程做到这一点,即它会保持缓慢但不会再阻碍主线程

我在技术上如何正确地执行两者,但我认为它会教育我。

0 个答案:

没有答案