一个大型malloc与多个较小的realloc

时间:2010-10-24 12:07:34

标签: c memory-management malloc realloc

对不起,如果之前有人询问,我一直无法找到我要找的东西。

我正在从列表中读取字段并将它们写入内存块。我可以

  • 浏览整个列表,找到所需的总大小,执行一个malloc然后再次遍历列表并复制每个字段;
  • 在写入值时,遍历整个列表和realloc内存块;

现在第一个似乎对我来说效率最高(呼叫次数最少)。这两种方法的优点和缺点是什么?

感谢您的时间。

3 个答案:

答案 0 :(得分:2)

第一种方法几乎总是更好。 realloc()通常通过将内存块的全部内容复制到新分配的更大块中来工作。所以 n reallocs可能意味着n个副本,每个副本都比最后一个大。 (如果每次向分配添加m个字节,则第一个realloc必须复制m个字节,下一个2m,下一个3m,...)。

迂腐的答案是,realloc()的内部性能影响是特定于实现的,没有标准明确定义,在某些实现中它可以通过魔法仙女工作,可以立即移动字节等等 - 但是任何现实的实现,realloc()意味着一个副本。

答案 1 :(得分:1)

根据您认为最有可能的最大值,您最初可能最好分配一定数量的空间。

然后,如果你发现你需要更多空间,不要只为额外分配足够的空间,分配一大块。

这将最小化重新分配的数量,同时仍然只处理列表一次。

举例来说,最初分配100K。如果您发现需要更多,请重新分配到200K,即使您只需要101K。

答案 2 :(得分:0)

不要重新发明轮子并使用CCAN的darray,它实现了类似于paxdiablo描述的方法。见darray on GitHub