hfh215246411 2023-07-19 16:16 采纳率: 90%
浏览 16

学习堆内存,栈内存时遇到一些疑惑

学习堆内存,栈内存时遇到一些疑惑
下面是我所知道的,有不对的地方欢迎指出:

js中基础变量存在栈内存中,如var a = 3;其中3存在于常量池中,并对应一个编号xx,而栈内存中则存着a对应xx,这样形成a->xx->3,从栈内存指向常量池。

而对象则存在堆内存中,如var b = {};在堆内存中存在一个对象{},对应一个编号yy,而在栈内存中存在一个b对应yy,形成一个b->yy->{}的形式,从栈内存指向堆内存。

那我现在有个问题,如果var c = {d:1};栈内存中是只存了c对应{d:1}的地址编号,还是同时存了一个c.d对应常量池中1的对应编号?也就是说,当我访问c.d时,具体的访问,是怎么走的?

另一个问题,所谓将{}存在堆内存中,{}在堆内存中是个什么样子的?一串二进制代码吗?

  • 写回答

3条回答 默认 最新

  • threenewbee 2023-07-19 16:26
    关注

    这要从基础的讲起,为什么要区分堆和栈
    首先,在支持递归调用的语言里,局部变量是有多个的,比如说
    function sum(i)
    {
    Console.Log(i);
    if (i == 0) return 0;
    var j = sum(i - 1);
    return i + j;
    }
    这里面的j,在递归调用的时候,有很多个,那么怎么办?显然堆栈是最好的选择,每次调用,都把它放进去,退出调用就自动清掉了。
    那么什么时候用到堆?
    如果一个变量的生命周期超过了函数的调用,那么用堆栈的话,函数退出了,这个变量还要保留,怎么办?存在哪里?就要一个全局的内存块把塔门接住。
    然后为什么要常量池?
    这个其实是为了性能的优化的考虑,对于不会变化的数据,比如字符串,那么可以让多个引用指向同一个变量,以达到节约内存的目的。
    你要先搞清楚这些

    评论

报告相同问题?

问题事件

  • 创建了问题 7月19日

悬赏问题

  • ¥20 搭建三相栅极电路后高侧浮动地VS存在电容特性
  • ¥20 云卓h12pro 数传问题
  • ¥20 请问有人知道怎么用工艺库里面的sdb文件通过virtuoso导出来library里面每个cell的symbol吗?
  • ¥20 海思 nnie 编译 报错
  • ¥50 决策面并仿真,要求有仿真结果图
  • ¥15 关于路由器的路由协议配置
  • ¥15 springboot接入微信支付SDK
  • ¥50 大区域的遥感影像匹配 怎么做啊
  • ¥15 求解答:pytorch跑yolov8神经网络受挫
  • ¥20 Js代码报错问题不知道怎么解决