开发者社区> 问答> 正文

动态分配阵列的理想增长率是多少?

C ++具有std :: vector,而Java具有ArrayList,许多其他语言都有其自己的动态分配数组形式。当动态数组空间不足时,它会重新分配到更大的区域中,并将旧值复制到新数组中。这种阵列性能的核心问题是阵列大小增长的速度。如果您总是只增长到足以容纳当前推送的大小,则最终每次都会重新分配。因此,将数组大小加倍或乘以1.5倍是有意义的。

有理想的成长因素吗?2倍?1.5倍?理想情况下,我的意思是数学上合理的,最佳的平衡性能和浪费的内存。我意识到从理论上讲,鉴于您的应用程序可能具有任何潜在的推送分布,因此这在某种程度上取决于应用程序。但是我很想知道是否有一个值“通常”是最佳的,或者在某些严格的约束条件下被认为是最佳的。

我听说某处有一篇论文,但是我一直找不到。问题来源于stack overflow

展开
收起
保持可爱mmm 2020-02-08 19:51:59 427 0
1 条回答
写回答
取消 提交回答
  • 我记得很多年前读过的书,为什么至少在C ++上首选1.5而不是两个(这可能不适用于托管语言,运行时系统可以随意重定位对象)。

    原因是这样的:

    假设您从16字节分配开始。 当您需要更多时,可以分配32个字节,然后释放16个字节。这在内存中留下了16个字节的空缺。 当您需要更多时,可以分配64个字节,以释放32个字节。这就留下了一个48字节的孔(如果16和32是相邻的)。 如果需要更多空间,则分配128个字节,以释放64个字节。这就留下了一个112字节的漏洞(假设所有先前的分配都相邻)。 等等等等。 这个想法是,通过2倍的扩展,没有时间点会导致产生的漏洞变得足够大,无法再用于下一次分配。使用1.5倍分配,我们改为:

    以16个字节开始。 当您需要更多空间时,分配24个字节,然后释放16个字节,留下16个字节的空位。 当您需要更多空间时,分配36个字节,然后释放24个字节,留下40个字节的空位。 当需要更多空间时,分配54个字节,然后释放36个字节,留下76个字节的空缺。 当您需要更多时,分配81个字节,然后释放54个字节,留下130个字节的空位。 如果您需要更多,请从130字节的空位中使用122字节(向上舍入)。

    2020-02-08 19:52:31
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
恒逸石化:用计算消耗取代能源消耗 立即下载
恒逸石化 -用计算消耗取代能源消耗 立即下载
共享充电+共享电能 立即下载