还有什么更好的替代std :: vector <std :: unique_ptr <T >>吗?

维托里奥·罗密欧(Vittorio Romeo)

我正在寻找一个需要满足以下要求的容器(针对游戏开发,尤其是实体管理)

  1. 快速迭代
  2. 没有存储元素的副本
  3. 没有使元素的指针无效
  4. 元素的移除和插入

例子:

Container<Entity> container;

// This pointer will always point to the player
Entity* player{new Entity};          
container.add(player);               

// Set some entities to "dead"
for(auto& e : container) if(e->type == "Enemy") e->die(); 

// Use erase-remove idiom on "dead" entities
container.cleanup();                 

// Player pointer is still valid
player->doSomething();               

到目前为止,我已经尝试了两种不同的容器类型:

  • std::vector<std::unique_ptr<T>>
    1. 缓存友好(快速迭代)
    2. 没有副本(感谢std::unique_ptr
    3. 不会使指针无效(感谢std::unique_ptr

...和...

  • std::list<T>
    1. 非缓存友好(迭代速度较慢)
    2. 无副本
    3. 没有指针无效

即使看起来违反直觉,std::vector<std::unique_ptr<T>>也比std::list<T> 按照我的基准测试更有效

(对于更大的类型,std::list<T>在插入过程中性能更高,但std::vector<std::unique_ptr<T>>仍会获胜)


我想知道是否有更好的替代方法std::vector<std::unique_ptr<T>>

理想地,替代方案应该是高速缓存友好的,以实现快速迭代,并允许用户即使添加/删除现有项目后也引用相同的项目(指针不应无效)

霍华德·辛南特

通过性能测试,您正在做正确的事情。那是回答这个问题的唯一真实方法。

我所知道的唯一可能更快的方法是创建一个缓冲区。然后为创建一个自定义分配器,该分配器vector<unique_ptr<T>, custom_allocator<unique_ptr<T>>>将从您的缓冲区分配。

还从同一缓冲区分配对象(这样,将unique_ptr的点指向缓冲区)。

为此,您必须知道上限,或者在超出限制时编写溢出逻辑。

使自定义分配器从缓冲区的中间向上增长。

使unique_ptrs的分配从缓冲区的中间向下增加。

只要整个缓冲区都适合高速缓存行,您就将尽可能快。这不是容易实现的,并且您当前的解决方案可能已经足够好了。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将std :: unique_ptr推回std :: vector时,编译器不会失败

调整大小std :: vector <std :: unique_ptr <T >>的性能

get()不会破坏std :: unique_ptr背后的想法吗?

声明包含std :: unique_ptr的结构的std :: vector类时出错

std :: unique_ptr是RAII的应用程序吗?

具有显式析构函数和std :: unique_ptr <>成员的类不能在std :: vector <>中使用吗?

为什么std :: shared_ptr <T> = std :: unique_ptr <T []>可以编译,而std :: shared_ptr <T []> = std :: unique_ptr <T []>不可以编译?

参数std :: unique_ptr <T> &&的std :: move或std :: forward

是否可以使用fill构造函数创建std :: vector <std :: unique_ptr <Bar >>?

在gcc 6中实现std :: unique_ptr <T []> :: reset

std :: remove_if来自std :: vector的多态std :: unique_ptr

使用std :: unique_ptr <T>&代替std :: unique_ptr <T>有什么优势吗?

C ++-vector <>中的std :: unique_ptr为nullptr

将std :: vector <std :: unique_ptr <T >>分配给另一个std :: vector <std :: unique_ptr <T >>

可以将std :: unique_ptr视为monad吗?

使用`std :: unique_ptr`时`std :: vector`中的数据不同

如何初始化std :: unique_ptr <std :: unique_ptr <T> []>?

std :: vector <std :: unique_ptr <>> :: push_back()的正确语法是什么?

使用std :: vector <double>访问由std :: unique_ptr <double [2]>管理的数据

如何检查std :: unique_ptr是否为空(如果它位于std :: vector中)?

如何调整std :: vector <std :: queue <std :: unique_ptr <int >>>的大小?

构造类成员std :: vector <std :: unique_ptr <AClass>的智能方法

std :: vector <std :: unique_ptr <int>>不编译

如何使用std :: vector <unique_ptr <T >>作为默认参数

std :: unique_ptr <T>而不在堆上分配内存

std :: vector <unique_ptr <class T >>的动态初始化

'operator[]' 不匹配(操作数类型是 'std::unique_ptr<std::vector<int> >' 和 'int')

使用 std::unique_ptr<T>::unique_ptr` 在 Visual Studio 2013 中构建错误

如何构造一个具有“unique_ptr”作为成员变量的对象的“std::vector”?