多个realloc比巨大的malloc更昂贵吗?

我使用动态数组来表示最小堆。 有一个循环可以删除最小值,并将随机元素添加到最小堆中,直到出现某种情况。 虽然我不知道堆的长度在运行时会如何变化(有很多随机性),但我知道上限,即1000万。 我有两个选择:

1)使用malloc声明一个小数组,然后当堆中的元素数量超过长度时调用realloc。

2)使用malloc声明一个1000万条目数组。 这避免了调用realloc。

选项2比选项1更有效吗?

我用我的代码测试了这个,并且使用2似乎有显着的(20%)运行时间减少。这是因为代码中的随机性而估计的。 使用malloc预先声明一个大型的10-50万个入口arrays有什么缺点吗?

如果你可以节省内存以进行大量的前期分配,并且它提供了有价值的性能提升,那么一定要做到这一点。

如果您坚持使用realloc ,那么您可能会发现每次将大小加倍而不是增加固定数量可以在性能和有效内存使用之间进行良好的权衡。

没有说当你使用realloc时,内存将从同一个地方扩展。也可能发生内存将在另一个区域中移位。
因此,使用realloc可能会导致复制您之前拥有的内存。
还要考虑系统调用可能需要一些开销,所以你最好调用一次malloc。

缺点是如果你没有使用所有空间,那么你占用了大量可能需要的内存。 如果您确切地知道需要多少字节,那么由于系统调用开销,一次分配会更有效,然后逐个分配。 通常你可能有一个上限但不知道确切的数字。 花时间来处理空间以处理上限可能需要1秒钟。 但是,如果这个特殊情况只有上限的一半,则可能需要0.75秒一块一块地分配。 所以它取决于你认为你将获得的上界有多接近。