当前位置:首页 > 科技  > 软件

「字符串」存在「栈内存」?那我可要杠你了哦!

来源: 责编: 时间:2024-03-27 17:39:54 272观看
导读前言大家好,我是林三心,用最通俗易懂的话讲最难的知识点是我的座右铭,基础是进阶的前提是我的初心。在我们的认知里:基础类型存栈内存,引用数据类型存堆内存。const a = '林三心'const b = { age: 18, height: 180}

前言

大家好,我是林三心,用最通俗易懂的话讲最难的知识点是我的座右铭,基础是进阶的前提是我的初心。9rp28资讯网——每日最新资讯28at.com

在我们的认知里:基础类型存栈内存,引用数据类型存堆内存。9rp28资讯网——每日最新资讯28at.com

const a = '林三心'const b = {    age: 18,    height: 180}

图片图片9rp28资讯网——每日最新资讯28at.com

超长字符串

大家都知道,字符串属于基础类型,所以大家会觉得字符串是存在栈内存中的,但是大家要知道,V8默认栈内存是984Kib,那如果一个超长字符串 > 984Kib能装的进栈内存吗?这也就是一个比较经典的问题——大象装箱问题,试问:一头大象能装进一个小箱子里吗?9rp28资讯网——每日最新资讯28at.com

图片图片9rp28资讯网——每日最新资讯28at.com

一探究竟

堆快照

先来看一段代码9rp28资讯网——每日最新资讯28at.com

const func = function() {  this.str1 = '林三心'  this.str2 = 'Sunshine_Lin'}const a = new func()const b = new func()

然后咱们来看看堆快照的详情9rp28资讯网——每日最新资讯28at.com

图片图片9rp28资讯网——每日最新资讯28at.com

上面的结果可以看出:9rp28资讯网——每日最新资讯28at.com

  • a 和 b的str1都指向同一个地址
  • a 和 b的str2都指向同一个地址

那我们可不可以猜测出一个结论:字符串的内容存于堆内存中,指针存于栈内存中,且相同的字符串指向同一个堆内存地址9rp28资讯网——每日最新资讯28at.com

修改和新增字符串

我们稍微修改下代码9rp28资讯网——每日最新资讯28at.com

const func = function() {  this.str1 = '林三心'  this.str2 = 'Sunshine_Lin'}const a = new func()const b = new func()// 修改str1a.str1 = '哈哈哈哈哈哈哈哈哈哈'// 新增str3,跟str2一样a.str3 = 'Sunshine_Lin'

再来看看现阶段的堆快照的详情9rp28资讯网——每日最新资讯28at.com

图片图片9rp28资讯网——每日最新资讯28at.com

上面的结果可以看出:9rp28资讯网——每日最新资讯28at.com

  • str1修改成一个新的字符串后,重新开辟了一个内存空间(新地址)
  • str3新增之后,指针指向已有的Sunshine_Lin的内存空间

那我们可不可以猜测出一个结论:新增或者修改字符串后,如果是一个之前不存在的字符串,则新开辟内存空间,如果是已有的,则直接使用已有的内存空间9rp28资讯网——每日最新资讯28at.com

源码分析

当我们声明一个字符串时:9rp28资讯网——每日最新资讯28at.com

  • 1、v8内部有一个名为stringTable的hashmap缓存了所有字符串,在V8阅读我们的代码,转换抽象语法树时,每遇到一个字符串,会根据其特征换算为一个hash值,插入到hashmap中。在之后如果遇到了hash值一致的字符串,会优先从里面取出来进行比对,一致的话就不会生成新字符串类。
  • 2、缓存字符串时,根据字符串不同采取不同hash方式。

图片图片9rp28资讯网——每日最新资讯28at.com

源码

图片图片9rp28资讯网——每日最新资讯28at.com

图片图片9rp28资讯网——每日最新资讯28at.com

通俗易懂总结

字符串的数据存于 堆内存 中,栈内存 中只是存其 地址指针9rp28资讯网——每日最新资讯28at.com

当我们新建一个字符串时,V8会从内存中查找一下是否已经有存在的一样的字符串,找到的话直接复用。如果找不到的话,则开辟一块新的内存空间来存这个字符串,并把地址赋给变量。9rp28资讯网——每日最新资讯28at.com

大家有没有想过,为什么字符串不能通过下标索引来进行修改呢?因为字符串的修改本质上只能是通过整个的修改,而不能局部修改。9rp28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-79841-0.html「字符串」存在「栈内存」?那我可要杠你了哦!

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: ZGC可伸缩低延迟垃圾收集器深度解析

下一篇: 聊聊Flink:这次把Flink的触发器(Trigger)、移除器(Evictor)讲透

标签:
  • 热门焦点
  • 红魔电竞平板评测:大屏幕硬实力

    前言:三年的疫情因为要上网课的原因激活了平板市场,如今网课的时代已经过去,大家的生活都恢复到了正轨,这也就意味着,真正考验平板电脑生存的环境来了。也就是面对着这种残酷的
  • 三分钟白话RocketMQ系列—— 如何发送消息

    我们知道RocketMQ主要分为消息 生产、存储(消息堆积)、消费 三大块领域。那接下来,我们白话一下,RocketMQ是如何发送消息的,揭秘消息生产全过程。注意,如果白话中不小心提到相关代
  • Temu起诉SHEIN,跨境电商战事升级

    来源 | 伯虎财经(bohuFN)作者 | 陈平安日前据外媒报道,拼多多旗下跨境电商平台Temu正对竞争对手SHEIN提起新诉讼,诉状称Shein“利用市场支配力量强迫服装厂商与之签订独家
  • 拼多多APP上线本地生活入口,群雄逐鹿万亿市场

    Tech星球(微信ID:tech618)文 | 陈桥辉 Tech星球独家获悉,拼多多在其APP内上线了“本地生活”入口,位置较深,位于首页的“充值中心”内,目前主要售卖美食相关的
  • 得物宠物生意「狂飙」,发力“它经济”

    作者|花花小萌主近日,得物宣布正式上线宠物鉴别,通过得物App内的“在线鉴别”,可找到鉴别宠物的选项。通过上传自家宠物的部位细节,就能收获拥有专业资质认证的得物鉴
  • 微博大门常打开,迎接海外画师漂洋东渡

    作者:互联网那些事“起猛了,我能看得懂日语了”。“为什么日本人说话我能听懂?”“中文不像中文,日语不像日语,但是我竟然看懂了”…&hell
  • 华为和江淮汽车合作开发百万元问界MPV?双方回应来了

    8月1日消息,郭明錤今天在社交平台发文称,华为正在和江淮汽车合作,开发售价在100万元的问界MPV,预计在2024年第2季度量产,销量目标为上市首年交付5万辆。
  • 由于成本持续增加,笔记本产品价格预计将明显上涨

    根据知情人士透露,由于材料、物流等成本持续增加,笔记本产品价格预计将在2021年下半年有明显上涨。进入6月下旬以来,全球半导体芯片缺货情况加剧,显卡、处理器
  • 北京:科技教育体验基地开始登记

      北京“科技馆之城”科技教育体验基地登记和认证工作日前启动。首批北京科技教育体验基地拟于2023年全国科普日期间挂牌,后续还将开展常态化登记。  北京科技教育体验基
Top