【内存管理】可变数组是怎么扩容的?
本帖最后由 白冥 于 2024-6-25 01:58 编辑可变数组(如在c++中的std::vector和Java中的ArrayList)是这样内存空间中分配内存的。每个可变数组在内部维护了两个关键的变量:size和capacity,从而实时跟踪数组的大小。
当向可变数组中添加新元素而size等于capacity,可变数组会自动进行扩容。
可变数组会向语言的运行时环境(如C++的运行时库和Java虚拟机JVM)请求一个新的、更大的内存块,而语言的运行时环境则会根据其语言所制定的扩容策略,给操作系统一个标准,请求一个合适的内存块,以减少未来扩容的频率。
Java要求新数组的大小通常是原数组大小的1.5倍或其他某个扩容因子;而C++要求大于原数组,没有固定的扩容因子,但一般是成倍地增加容量。
然后它们将新内存块并分配给新数组,将原数组的每一个元素复制进新数组中,释放旧数组的内存,并将指针指向新数组,更新更新size和capacity,实现可变数组的扩容。
static/image/hrline/5.gif
插个眼,我的第一门编程语言由于是Python,所以一开始我很难理解为什么C的数组的大小是固定的,找了很久怎么写可变数组的方法(最后是屈服了,太麻烦了)。
操作系统一般不知道运行时环境会请求多大的内存,于是把内存分割得东一块西一块,大小并不固定。所以可变数组严格来说是“不可能的”,即你不能把内存块扩大。
和我一开始像的办法一样,我最开始学C语言的时候,实际上是创建新数组……复制过去……释放旧数组……把指针指向新数组这种笨方法,结果真是这样的。
不过呢,我打死也不再想用C了,太麻烦了。有更好的语言干嘛不用呢?
不过我不确定C是不是真的用不了可变数组,我记得某个标准库似乎有可变数组,但是很多老师不讲,我也不确定是不是真的有,有也不会用(悲)。
static/image/hrline/5.gif
C比较底层,目前有很多的数据处理方向的主流语言还是C 现在最广泛使用的还是C吧,不过C确实不好学{:6_164:} 还是python好,从来不用考虑数组容量的问题 因为面向的东西不同,我们做硬件底层设计只能用C欸....C艹都不行哈哈哈... 感觉审计行业目前一个python就够用了:lol 这学期我学的就是c++
可变数组的话有一个动态分配内存(我也叫它不定长度数组),大概代码长这样:
int a* = new int; ##n可为任意变量,该句为动态分配内存
delete[] a; ##此句为释放内存
这个动态分配内存在后续学习链表的时候会用到
可以去这个链接里在看一看点我跳转教程 我知道一点就是c++里的vector容器是可以自动扩容的。 但是C的效率确实很高 以前学的c语言考试完就忘光了{:6_167:} 白老师,以后你可以开code的课ing(日积月累) 楼主讲得很专业,把人都吓跑了 ;P 0-0 感觉是方向不同吧。。小白悄咪咪路过 我也感觉Python比较好用,C感觉一些写法很繁琐{:6_164:} 看到大佬们谈论这些高深的知道,我感觉自己很无助{:6_176:} 电脑系统和手机最大的区别就是,电脑作为生产力工具,为了保证内存,宁可卡死也不会杀后台(
页:
[1]