我有疑问/好奇心。 假设我想实现一个列表,例如我基本上可以使用cormen book方法。在哪里解释如何实现,插入,删除,密钥搜索等。
然而,对于内存使用而言,没有任何说法。例如,如果我想在整数列表中插入一个整数。我可以例如首先创建一个节点(我在那里分配内存)插入整数然后在列表中插入节点。如果我想删除一个整数,一旦我知道存储了哪个节点,我就必须释放内存。
我现在想知道是否更方便的是预先分配内存以存储10个节点并保留指向要使用的空闲节点的指针。如果内存池已满,那么我将为20个节点重新分配内存,如果池大于此类池的一半(依此类推)等等。该池当然更难管理,因为我需要例如处理可能的内存碎片等。
我说的是否有意义?还是没有意义?我已经读过一本关于游戏编程的书,内存预分配可以提高性能,但我想知道如何。
答案 0 :(得分:1)
这既是一个简单而又复杂的问题。如果您在标准问题内运行,则不必担心内存分配问题。例如,为10个节点预分配内存在任何规模上都不会有效,而您的性能问题可能在其他地方。但是,如果您的程序每秒不断分配和释放数百或数千个小对象,则可能导致内存碎片,您可能需要编写自定义分配器。
除import json
data = json.loads('json_string')
函数外,几乎没有标准容器没有任何预分配元素存储的方法。但是,所有这些都允许在构造函数中使用自定义分配器。此外,还有placement new运营商。
你可以尝试尝试这些东西,写起来很有趣,如果你绝对没有必要,就不要在制作中使用它们。
答案 1 :(得分:0)
我现在想知道是否更方便的是预先分配内存以存储10个节点并保留指向要使用的空闲节点的指针。
你基本上是在描述池分配器通常做什么(我假设你在谈论的是常量大小的节点)。因此,对您的问题的简短回答是:是的,您可以通过使用带有列表容器的池分配器来提高性能。
通用编译器附带的内存分配器非常适合通用分配(即用于分配随机大小的对象)。但是,当您需要分配常量大小的对象时,应考虑使用自定义池分配器。您可以轻松理解为什么常量大小的对象分配器的执行速度比标准分配器快。
您可以编写自己的池分配器,但这不是一项简单的任务,您最好考虑使用现有的分配器,例如boost pool_allocator或fast_pool_allocator。