【发布时间】:2017-07-07 21:02:40
【问题描述】:
在编写游戏时,我曾经将所有游戏对象存储在具有初始化和固定大小的 std::vector 中。最近我觉得需要在游戏对象类之间进行一些继承。
假设我有 40 个类从我的类 Enemy 派生。如果我想将这些类的对象/实例存储在向量中,我只能选择将它们存储为向量 Enemy* 对吗?所以唯一连续分配的是指针,对吧?所以当需要取消引用时,我仍然会有很多缓存未命中,对吧?
是否有任何“最佳实践”方式,将派生类存储在连续分配的内存中,以便循环通过它们花费最少的时间?
【问题讨论】:
-
我认为他在谈论类实例。这对我来说似乎很清楚。
-
我指的是那些类的对象。实例。在运行时创建并分配的东西。
-
使用指向向量内基类的指针,或者如果它更合适,则使用某种智能指针。
-
我认为将它们存储在向量中
正是您要寻找的。向量似乎是 c++ 用于迭代和存储的最佳实践工具。而且由于它们是指针,所以它与矢量 相同,所以也很好。 -
有几种方法,但它们在技术上都相当复杂。我强烈建议您从
vector<unique_ptr<Enemy>>和基准开始。如果您确实需要走这条路,那么这种具有大量派生类的最简单/最可行的方法是使用自定义分配器来确保所有 Enemies 都在连续的内存块中构建。您仍然会使用 unique_ptr 的向量和自定义删除器,并使用其他函数而不是make_unique。
标签: c++ memory vector containers allocation