2017-07-07 31 views
4

编程游戏时,我用来将所有游戏对象存储在具有初始化和固定大小的std :: vector中。最近我觉得需要在游戏对象类中进行一些继承。用于C++中不同派生类的高效容器

所以我们假设我有40个类从我的敌人派生出来。如果我想将这些类的对象/实例存储在一个向量中,我只能选择将它们存储为向量Enemy *对吗?所以连续分配的唯一东西就是指针,对吧?所以当这些需要被解除引用时,我仍然会有很多缓存未命中,对吧?

是否有任何“最佳实践”的方式,将派生类存储在合理分配的内存中,以便循环遍历它们需要最少的时间?

+1

我认为他在谈论类实例。这似乎很明显。 – TinkerTenorSoftwareGuy

+0

我指的是这些类的对象。实例。在运行时创建并分配的东西。 – user3808217

+0

使用指向基类内的向量,或者如果它更合适,某种智能指针。 – Klaus

回答

2

Boost刚刚接受了一个图书馆正是为了这个目的:poly_collection。特别是,您正在寻找base_collection

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

This article作者提供了一些设计背景和其他解决方案的比较,如向量unique_ptr。优点有两方面:第一,通过不使用指针和每个元素的动态内存分配,您拥有更好的内存局部性;第二,将相同类型的元素分组在一起,you help branch prediction和虚拟成员函数的指令缓存。