C ++具有std :: vector,而Java具有ArrayList,许多其他语言都有其自己的动态分配数组形式。当动态数组空间不足时,它会重新分配到更大的区域中,并将旧值复制到新数组中。这种阵列性能的核心问题是阵列大小增长的速度。如果您总是只增长到足以容纳当前推送的大小,则最终每次都会重新分配。因此,将数组大小加倍或乘以1.5倍是有意义的。
有理想的成长因素吗?2倍?1.5倍?理想情况下,我的意思是数学上合理的,最佳的平衡性能和浪费的内存。我意识到从理论上讲,鉴于您的应用程序可能具有任何潜在的推送分布,因此这在某种程度上取决于应用程序。但是我很想知道是否有一个值“通常”是最佳的,或者在某些严格的约束条件下被认为是最佳的。
我听说某处有一篇论文,但是我一直找不到。问题来源于stack overflow
我记得很多年前读过的书,为什么至少在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字节(向上舍入)。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。