白冥 发表于 2024-6-25 01:49:50

【内存管理】可变数组是怎么扩容的?

本帖最后由 白冥 于 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


娱乐法师火布偶 发表于 2024-6-25 02:06:13

C比较底层,目前有很多的数据处理方向的主流语言还是C

糖醋鲤鱼 发表于 2024-6-25 03:31:49

现在最广泛使用的还是C吧,不过C确实不好学{:6_164:}

silencedonkey 发表于 2024-6-25 03:38:31

还是python好,从来不用考虑数组容量的问题

Destin 发表于 2024-6-25 08:22:39

因为面向的东西不同,我们做硬件底层设计只能用C欸....C艹都不行哈哈哈...

圣卫幻梦 发表于 2024-6-25 09:26:51

感觉审计行业目前一个python就够用了:lol

Just Dust 发表于 2024-6-25 12:38:44

这学期我学的就是c++
可变数组的话有一个动态分配内存(我也叫它不定长度数组),大概代码长这样:
int a* = new int; ##n可为任意变量,该句为动态分配内存
delete[] a; ##此句为释放内存
这个动态分配内存在后续学习链表的时候会用到
可以去这个链接里在看一看点我跳转教程

狼兀 发表于 2024-6-25 13:15:41

我知道一点就是c++里的vector容器是可以自动扩容的。

s1iverhand 发表于 2024-6-25 16:50:05

但是C的效率确实很高

cdcai 发表于 2024-6-25 18:54:45

以前学的c语言考试完就忘光了{:6_167:}

Ullnllmll 发表于 2024-6-25 22:57:45

白老师,以后你可以开code的课ing(日积月累)

jdd 发表于 2024-6-30 01:52:30

楼主讲得很专业,把人都吓跑了 ;P

zhuovboyan 发表于 2024-6-30 23:40:21

0-0 感觉是方向不同吧。。小白悄咪咪路过

ZHD 发表于 2024-7-2 21:47:54

我也感觉Python比较好用,C感觉一些写法很繁琐{:6_164:}

chouki 发表于 2024-7-13 20:40:51

看到大佬们谈论这些高深的知道,我感觉自己很无助{:6_176:}

星之子 发表于 2024-7-27 23:24:37

电脑系统和手机最大的区别就是,电脑作为生产力工具,为了保证内存,宁可卡死也不会杀后台(
页: [1]
查看完整版本: 【内存管理】可变数组是怎么扩容的?