如何在不使用new的情况下使在其他对象内部创建的对象保持活动状态?

时间:2018-09-09 18:12:55

标签: c++ oop dynamic-allocation

我正在用C ++编写游戏,并且遇到了这个设计问题:

我为游戏中的所有对象都有一个名为Entity的基类。为了使用继承,我将指针存储在octree中。在我的游戏中,有些对象将由其他对象的方法创建。问题是:我可以在哪里存储以此方式创建的对象,以便在游戏过程中保持存在,以便存储的指针有效?

我不想使用new,因为我将以这种方式创建大约数百甚至数千个对象,而且我听说new非常慢。

到目前为止,我提出的唯一方法是拥有一个存储所有这些对象的大向量。该向量可能会被初始化为一个巨大的大小,因此它不必调整自身大小并弄乱我的指针。不过,这似乎很愚蠢。

2 个答案:

答案 0 :(得分:1)

第一:不要太担心性能。遵循一些基本规则,您会没事的:

  • 避免复制大对象(通过指针或引用传递)
  • 在地图上优先选择矢量,并在您有<50个条目或不需要订购时进行设置
  • 看看std :: algorithm库为您提供了什么-这些功能通常都是经过快速测试的

您的项目最重要的事情是:考虑结构和设计

  • 使用清晰的界面
  • 承担对象的单一责任
  • 优先考虑继承而不是继承

关于您的具体问题: 最好有一个“ ObjectManager”类。作为第一个实现,矢量也是可以的,只需将其隐藏为实现的详细信息,以便稍后在需要时进行更改。

答案 1 :(得分:0)

一种改进new的方法是为对象定义custom allocators,该对象利用有关类的知识来编写比标准类更好的新类。

好消息是,您可以立即使用new编写代码,然后再创建自定义分配器。因此,不要迷失于过早优化的危险中,也就是说,我们都知道:

  

过早的优化是万恶之源
  -唐纳德​​·克努斯(Donald Knuth)

如果Entity是所有对象的基类,那么我想您将大量使用多态。不幸的是,由于slicing的问题,您无法轻松地管理矢量中的多态对象(这将是更方便,更安全的方法)。因此,在这种情况下,指针是可以的。也许您可以考虑使用shared_ptr来避免内存泄漏。

话虽这么说,您可能对this article感兴趣,涉及游戏中的实体组件系统模式以及内存分配。