C ++中不同派生类的有效容器

use*_*217 5 c++ memory containers allocation vector

在对游戏进行编程时,我曾经将所有游戏对象存储在具有初始化和固定大小的std :: vector中。最近,我感到需要在游戏对象类之间进行一些继承。

因此,假设我有40个类来自我的敌人类。如果我要将这些类的对象/实例存储在矢量中,则只能选择将它们存储为矢量Enemy *,对吗?因此,唯一连续分配的是指针,对吗?因此,当需要取消引用这些缓存时,我仍然会有很多缓存丢失,对吗?

是否有任何“最佳实践”方式,将派生类存储在连续分配的内存中,从而使它们之间的循环花费最少的时间?

Ily*_*pov 3

Boost 刚刚接受了一个专门用于此目的的库:poly_collection. 特别是,您正在寻找base_collection

在内部,它使用许多向量,每个(派生)类型一个向量,同时提供接近标准容器的接口。

作者的这篇文章提供了一些设计背景以及与其他解决方案的比较,例如 的向量unique_ptr。优点有两个:首先,通过不使用指针和每个元素的动态内存分配,您可以获得更好的内存局部性;其次,将相同类型的元素分组在一起,有助于虚拟成员函数的分支预测和指令缓存。