为动态数据结构预分配内存

use*_*759 5 c c++ memory memory-management

我有一个问题/好奇心。假设我想实现一个列表,例如我基本上可以使用 cormen book 方法。其中解释了如何实现、插入、删除、键搜索等。

然而,关于内存使用的内容没有说。例如,如果我想在整数列表中插入一个整数。例如,我可以先创建一个节点(我在那里分配内存)插入整数,然后在列表中插入节点。如果我想删除一个整数,一旦我知道存储在哪个节点中,我就必须释放内存。

我现在想知道是否预先分配内存来存储,比如 10 个节点并保留一个指向要使用的空闲节点的指针会更方便。如果内存池已满,那么我会为 20 个节点重新分配内存,如果池很大,则是此类池大小的一半(依此类推)。池的管理当然更复杂,因为我需要例如处理可能的内存碎片等。

我说的有道理吗?还是没有意义?我在一本书中读到,对于游戏编程,内存预分配可以提高性能,但我想知道如何。

bul*_*zzr 1

这是一个既简单又复杂的问题。如果您在标准问题内操作,则实际上不需要担心内存分配。例如,为 10 个节点预分配内存在任何规模下都不会高效,并且您的性能问题可能在其他地方。但是,如果您的程序每秒不断地分配和释放数百或数千个小对象,则可能会导致内存碎片,并且您可能需要编写自定义分配器。

除了函数之外,几乎所有标准容器都没有任何方法来预分配元素存储std::vector::reserve。然而,所有这些都允许在构造函数中使用自定义分配器。此外,还有放置新运算符。

您可以尝试尝试这些东西,它们写起来很有趣,只是如果绝对不需要,请不要在生产中使用它们。

  • 完全错误。*如果您在标准问题下操作,您实际上不需要担心内存分配* - 在 mt 环境中,每次分配都是一场灾难。 (4认同)