realloc()的性能影响

vin*_*dyz 18 c algorithm programming-languages

我有一个记录列表,在开始我不知道记录的数量.我需要将它们读入数组.因此,建议逐个读取所有记录并逐个进行重新分配,然后随着元素的增加继续增加数组大小,或者我应该花一次通过来识别记录数并只执行一次malloc吗?哪一个计算成本会低一些?

cni*_*tar 29

A realloc不是很贵.但要求realloc每个元素有点多.我建议你这样做:

  • 从尺寸开始
  • 添加元素时,请检查是否有足够的空间
  • 如果没有足够的空间,可以加倍

正确地猜测适当的初始大小也有帮助.因此,如果60%的输入少于100条记录,请从此开始.

  • `realloc`可能会或可能不会很昂贵,因为如果必须移动内容需要线性时间.我不得不重写一个程序来预先计算输出大小,因为重新分配时间非常重要,即使数组大小加倍也是如此. (5认同)
  • 加倍不是获得线性性能所必需的,但是你应该总是使用*常数*因子,通过当前大小*K增加一些值K,通过实验确定平衡重新分配的成本与浪费空间的成本.例如,C++ STL使用1.5.完成添加到阵列后,还可以向下重新分配以恢复未使用的内存. (3认同)
  • 没有一种方法是完美的。我自己过去曾使用过一个常数因子(事实证明,对于大尺寸,将尺寸加倍是有问题的)。所以我同意,其他方法可能会更好,具体取决于应用程序。 (2认同)

Jør*_*ogh 5

正如其他人所指出的,每当数组变满时,将其大小加倍是一种常见的技术。事实上,使用这种技术可以确保每个元素花费的时间不超过恒定量,如WikiPedia 上所述。

根据代码需要的速度以及您正在读取的源,在单独的过程中计算输出的大小可能是一个好主意。如果您从磁盘读取数据,您可能应该使用动态数组,但否则您可能应该做任何更容易实现的事情。

  • “可以从数学上证明,增长因子 2 绝对是最坏的情况,因为它永远不允许向量重用任何先前分配的内存” - https://github.com/facebook/folly/blob/master /folly/docs/FBVector.md#内存处理 (3认同)