我一直在迁移我的代码以使用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万件事情的速度很慢。 然后我想我的解决方案与链接问题中的解决方案类似:
我知道我将要批量删除的元素的池内存,但它被认为非常麻烦并且容易出现严重错误
让工作线程做到这一点,即它会保持缓慢但不会再阻碍主线程
我在技术上如何正确地执行两者,但我认为它会教育我。