GameMale
登陆 / 注册 搜索

USERCENTER

SEARCHSITE

搜索

查看: 764|回复: 16
收起左侧

[技术交流] 【内存管理】可变数组是怎么扩容的?

[复制链接] |关注本帖

邪恶的面具堕落之舞风雪之家香喷喷的烤鸡眼镜蛇图腾寻觅牧羊人

     楼主| 白冥 发表于 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,实现可变数组的扩容。


    插个眼,我的第一门编程语言由于是Python,所以一开始我很难理解为什么C的数组的大小是固定的,找了很久怎么写可变数组的方法(最后是屈服了,太麻烦了)。
    操作系统一般不知道运行时环境会请求多大的内存,于是把内存分割得东一块西一块,大小并不固定。所以可变数组严格来说是“不可能的”,即你不能把内存块扩大。
    和我一开始像的办法一样,我最开始学C语言的时候,实际上是创建新数组……复制过去……释放旧数组……把指针指向新数组这种笨方法,结果真是这样的。
    不过呢,我打死也不再想用C了,太麻烦了。有更好的语言干嘛不用呢?
    不过我不确定C是不是真的用不了可变数组,我记得某个标准库似乎有可变数组,但是很多老师不讲,我也不确定是不是真的有,有也不会用(悲)。





    评分

    参与人数 1追随 +1 收起 理由
    jdd + 1 赞一个!

    查看全部评分

    回复

    使用道具 举报

    百相千面-晦永远的克叔業火死鬥实现梦想官复原职虚空之海的鲸Zootopia幸运女神的微笑『逆境中的幸运女神』御医神兔

      C比较底层,目前有很多的数据处理方向的主流语言还是C
        收起(2)
      回复

      使用道具 举报

      传说的黑道-桐生一马大黄蜂(ChevroletCamaro).远古石碑天灾骑士十字军护盾力量腕带诺克提斯·路西斯·伽拉姆黑暗消融刀锋女王 - 归宿叶卡捷琳娜大帝

        现在最广泛使用的还是C吧,不过C确实不好学
        回复

        使用道具 举报

        業火死鬥永浴爱河泰比里厄斯虚空之海的鲸实现梦想净化污秽的天照阿怪不灭狂雷征服之王吃饱金币的Doge

          还是python好,从来不用考虑数组容量的问题
            收起(1)
          回复

          使用道具 举报

          永远的克叔Joker.布衣+12 传奇的男用贞操带和你一起飞行的皮卡丘雷夜嘯聲

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

            使用道具 举报

            史莱姆牧场吸血魔蝠萨菲罗斯苏醒的格罗姆圣甲虫秘典可爱黑猫诺克提斯·路西斯·伽拉姆夏日柯基美恐:新的开始

              回复

              使用道具 举报

              遗忘之水小丑与格雷与星光璀璨『落樱缤纷』『灰域来音』『眼榴』『钟楼盐水棒冰』『泥潭颂唱者』『逆境中的幸运女神』『南瓜拿铁』杰森‧斯坦森.

                回复

                使用道具 举报

                结晶火鹰幼崽林中松鼠夏日柯基黑豹.刺杀者匕首混血王子月亮提灯甘道夫·护戒使者

                  这学期我学的就是c++
                  可变数组的话有一个动态分配内存(我也叫它不定长度数组),大概代码长这样:
                  1. int a* = new int[n]; ##n可为任意变量,该句为动态分配内存
                  2. delete[] a; ##此句为释放内存
                  复制代码

                  这个动态分配内存在后续学习链表的时候会用到
                  可以去这个链接里在看一看点我跳转教程
                    收起(4)
                  回复

                  使用道具 举报

                  烈焰天使弓

                    我知道一点就是c++里的vector容器是可以自动扩容的。
                      收起(1)
                    回复

                    使用道具 举报

                    幸福的小阿尔十字叶章符文披风擎天柱(Peterbilt389).刀锋女王 - 归宿月光骑士诺克提斯·路西斯·伽拉姆Forever Titanic森林鹿月光骑士

                      回复

                      使用道具 举报

                      虚空之海的鲸『私有海域』『钜鲸』『星河碎片』『召唤好运的角笛』『交钥匙了!』『矩阵谜钥Ⓖ』十周年扭蛋 - 红『落樱缤纷』红心玉

                        回复

                        使用道具 举报

                        史莱姆蛋享受美食的小伯

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

                          使用道具 举报

                          风雪之家史莱姆牧场达拉然诺克提斯·路西斯·伽拉姆小丑与格雷与星光璀璨不洁圣子近地夜航

                            jdd 发表于 2024-6-30 01:52:30 | 显示全部楼层 |取消关注该作者的回复
                            回复

                            使用道具 举报

                            『住在GM村』格拉迪欧拉斯雪王的心脏『星河碎片』『灰域来音』预知水晶球炽天使之拥『伊黎丝的赞词』纯真护剑『随时随地开启!』

                              回复

                              使用道具 举报

                              卡利亚权杖『不败之花』火柴 - Gamemale 『先知灵药:真视』Forever Titanic无尽的怀表(人)血球蛋白十字叶章雷夜嘯聲

                                ZHD 发表于 2024-7-2 21:47:54 | 显示全部楼层 |取消关注该作者的回复
                                回复

                                使用道具 举报

                                脉律辐石劫掠核芯御医神兔夏日柯基幽灵竹筒黄金树的恩惠探险三杰士图腾饼干生活拍立得璀璨金币

                                  回复

                                  使用道具 举报

                                  咆哮诅咒茉香啤酒神秘商店贵宾卡SCP-s-1889-第二页虚空之海的鲸『随时随地开启!』被释放的灵魂『随时随地开启!』无尽的怀表不朽之恋

                                    电脑系统和手机最大的区别就是,电脑作为生产力工具,为了保证内存,宁可卡死也不会杀后台(
                                    回复

                                    使用道具 举报

                                    您需要登录后才可以回帖 登录 | 立即注册

                                    本版积分规则

                                    文字版|手机版|小黑屋|GameMale

                                    GMT+8, 2024-12-4 01:11 , Processed in 0.140614 second(s), 128 queries , Redis On.

                                    Copyright © 2013-2024 GameMale

                                    All Rights Reserved.

                                    快速回复 返回列表