C++ - 连续记忆和多态性

C++ - contiguous memory and polymorphism

本文关键字:多态性 记忆 连续 C++      更新时间:2023-10-16

我有一个名为GameObject的基类,其他类也从中派生出来。我想知道通过在连续内存中分配所有派生的GameObjects类来处理内存分配是否会提高性能。

我最终将遍历每个游戏引擎帧的所有帧。

我的问题是,在这种情况下,连续内存存储是否比不连续的错位内存给我更快的迭代时间?在这两种情况下,我都必须保留指向游戏对象的指针向量,因为它们的大小会有所不同。

循环访问连续内存中的对象可能效果更好,因为缓存和局部性。但是,我建议您构建这两个系统并实际分析它们。祝你好运!

我不确定我是否理解这个问题。您是否在问将所有对象预先分配到一个巨大的内存块中并将指向该子部分的指针存储在内存中是否更好? 如果是这样,请不要这样做。

而不是更快,你更有可能减慢速度,因为系统必须请求较大块的连续内存,而不是较小块的非连续内存。 请记住块分配、分页等。 您可以请求 100 MB 的连续内存,但它实际上不是连续的。其中一堆在磁盘中,无论如何,所有内容都分解成页面。

然后,您面临的问题是,您是一次性分配所有游戏对象以获得连续内存,还是按需创建它们?您真的要为这一次小优化预先分配吗? 如果需要创建新对象并且连续内存块不够大,会发生什么情况?等。

真的,我只是在这里集思广益潜在的问题。就像其他评论所说的那样,这是一个过早优化的情况。

现在,如果您将所有指针存储在一个连续的数组中,而不是根据其当前大小增长和复制的向量,它肯定会更快,但即便如此,除非您绝对知道游戏对象的数量,否则您最好分配一个足够大的向量,以便它只增长一两次。