Realloc与链接列表扫描

时间:2011-05-11 14:24:45

标签: c linked-list realloc

我必须从文件中读取未知数量的行并将它们保存到结构中(我希望避免使用预处理来计算元素的总数)。 在阅读阶段之后,我必须对这些行的每个元素进行一些计算。

我想出了两种方法:

  1. 每次读取行时都使用realloc。这样,分配阶段很慢,但由于索引访问,计算阶段更容易。

  2. 每次读取行时都使用链接列表。这样,分配阶段更快,但计算阶段更慢。

  3. 从复杂的角度来看,什么是更好的?

3 个答案:

答案 0 :(得分:8)

您多久会浏览一次链表?如果它只是一次去链表。还有一些事情:那会有很多小额分配吗?您可以制作一些较小的缓冲区,让我们说10行并链接那些togeteher。但这都是剖析问题。

我先做最简单的事情,看看是否符合我的需要,然后再考虑优化。

有时,即使第二个最佳解决方案也能完美地满足需求,人们也会浪费太多时间来考虑最优解决方案。

答案 1 :(得分:5)

如果没有关于如何使用这些信息的更多细节,那么评论复杂性就有点难了。但是,这里有一些想法:

  • 如果使用realloc,重新分配可能会更好地添加“一些”更多项目(而不是每次都添加一项)。通常,一个好的算法是每次加倍大小。
  • 如果您使用链接列表,则可以通过简单的后处理步骤加快访问速度。将数组元素设置为列表中的每个项目后,分配一个指向项目的指针数组并遍历列表。
  • 如果项目在文件中具有固定大小,您可以通过搜索文件末尾,确定大小,除以项目大小并获得结果来预先计算大小。即使它不是固定大小,您也可以将其用作估计值以“接近”所需大小并减少所需的realloc数量。

答案 2 :(得分:1)

正如其他用户已经说过的那样:

  

过早优化是其根源   所有的邪恶

唐纳德克努特

我使用realloc提出了不同的建议:在C ++ STL中,std::vector容器每次插入对象时都会增长,并且没有足够的空间可用。增长的大小取决于当前预先分配的大小,但具体是实现。例如,您可以保存预分配对象的实际数量。如果大小用完,则使用当前分配的双倍空间调用reallocate。我希望这有点可以理解!

当然,你应该分配更多的空间,而不是实际消耗和需要的空间。