C - 动态数组

时间:2011-07-19 17:06:59

标签: c arrays dynamic malloc realloc

我正在尝试使用fscanf()为数组提供循环,同时循环包含整数列表的文件,n个整数长整数。似乎我需要使用malloc和/或可能realloc。我听说malloc命令占用了相当多的执行时间,并且最好过度分配。有人会介意帮助我理解实现这一目标的基石吗?

免责声明:我是C的新手。

7 个答案:

答案 0 :(得分:7)

不,你听到的是误导(至少对我来说)。 malloc只是一个功能,通常是一个快速的功能。

  • 大部分时间它在用户空间中完成所有工作。它“全面分配”,所以你不必
  • 簿记(带有免费积木等的链表)经过高度优化,因为几乎每个人都使用malloc

认为你可以在这场比赛中轻松击败malloc是不现实的。如果这不能回答你的问题(这很普遍),我很抱歉,但你必须意识到没有( spoon )优化你可以轻松实现。

答案 1 :(得分:6)

读取文件比分配内存慢得多!

你可能想要阅读整个文件并找出你想要多少个entires,然后一起去malloc()。

的malloc(的sizeof(int)的* N)

答案 2 :(得分:4)

过早优化是所有邪恶的根源(谷歌)。

也就是说,为你手头的任务分配你认为合理/典型的任何金额,并在必须重新分配时加倍。这个策略很难被击败。

答案 3 :(得分:0)

对于您的具体情况,malloc不会给您带来问题。 fscanf的运行时间将比malloc和free的开销慢许多倍。但是,它可以添加到应用程序的高性能区域。在这些领域,还有其他方法,如mem池和固定大小分配器,可以对抗malloc()的开销。但是,当你刚开始时,你不需要担心性能开销。

答案 4 :(得分:0)

请注意malloc()为每个分配增加了一些开销以维持其内部数据结构(在常见实现中至少为4个字节),因此如果整数长度为4个字节,则为每个执行malloc()整数将具有≥50%的开销(可能是75%)。这相当于在Java中使用Integer的数组,而不是int的数组。

正如@Charles Dowd所说,一次性分配所有内存要好得多,以避免开销。

答案 5 :(得分:0)

您不希望在读取每个整数时调用mallocrealloc,这是肯定的。你能估算一下你需要多少空间吗?你控制文件格式吗?如果是这样,您可以让文件的第一行是一个整数,表示从文件中读取多少个整数。然后你可以一次性分配你需要的所有空间。如果你不控制格式而不能这样做,请遵循这个线程中提到的其他建议:分配一个合理大小的缓冲区,并在每次空间不足时加倍。

答案 6 :(得分:0)

这是一个文本文件(不是二进制文件)而不是固定格式,对吗?否则很容易从文件大小(buffer_size = file_size / record_size计算数组的大小,buffersize是单词(int的大小),其他大小是以字节为单位)。

这就是我要做的事情(但在应用统计数据方面,我有点疯狂。)

1)数字(也就是记录)在文件中占用的最大字符数(也就是字节数)是多少,不要忘记包含行尾字符(CR,NF)和其他空白字形(空格,标签等)?如果您已经可以估计记录的平均大小,那么它会更好,您可以使用它而不是最大大小。

initial_buffer_size = file_size / max_record_size + 1    (/ is integer division)

2)分配该缓冲区,将整数读入该缓冲区直到它满了。如果读取整个文件,则表示您已完成,否则请调整大小或重新分配缓冲区以满足新的估计需求。

resize_size = 
   prev_buffer_size
   + bytes_not_read / ( bytes_already_read / number_of_records_already_read ) 
   + 1

3)读入该缓冲区(从前一个读数结束),直到它已满,或者已经读取了所有文件。

4)如果没有完成,请使用新的prev_buffer_size重复步骤2)。

如果数字(记录)从字节大小的角度完全随机分布,这将最有效。如果没有,如果你知道他们有什么样的分布,你可以根据它调整算法。