Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多个realloc是否比一个大型malloc更昂贵?_C_Arrays_Malloc_Realloc - Fatal编程技术网

多个realloc是否比一个大型malloc更昂贵?

多个realloc是否比一个大型malloc更昂贵?,c,arrays,malloc,realloc,C,Arrays,Malloc,Realloc,我使用动态数组来表示最小堆。有一个循环删除最小值,并将随机元素添加到最小堆中,直到出现某种情况。虽然我不知道堆的长度在运行时会如何变化(有很多随机性),但我知道上限是1000万。我有两个选择: 1)使用malloc声明一个小数组,然后在堆中的元素数量超过长度时调用realloc 2)使用malloc声明一个1000万条目的数组。这避免了调用realloc 问题 方案2是否比方案1更有效 我用我的代码对此进行了测试,使用2似乎可以显著减少运行时间(20%)。这是由于代码中的随机性而估计的。使用ma

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

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

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

问题

方案2是否比方案1更有效


我用我的代码对此进行了测试,使用2似乎可以显著减少运行时间(20%)。这是由于代码中的随机性而估计的。使用malloc-up-front声明一个1000-5000万条目的大型数组有什么缺点吗?

如果您可以腾出内存进行大型的预先分配,并且它提供了值得的性能提升,那么请务必这样做


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

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

并不是说当你使用realloc时,内存将从同一个位置扩展。也可能发生内存将在另一个区域移位的情况。
因此,使用realloc可能会导致复制以前的内存卡盘。
还要考虑系统调用可能会占用一些开销,所以你最好一次调用MAOLC。