对不起,如果之前有人询问,我一直无法找到我要找的东西。
我正在从列表中读取字段并将它们写入内存块。我可以
malloc
然后再次遍历列表并复制每个字段; realloc
内存块; 现在第一个似乎对我来说效率最高(呼叫次数最少)。这两种方法的优点和缺点是什么?
感谢您的时间。
答案 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