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

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

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

前言

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

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

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

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

超长字符串

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

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

一探究竟

堆快照

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

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

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

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

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

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

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

修改和新增字符串

我们稍微修改下代码o5h28资讯网——每日最新资讯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'

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

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

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

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

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

源码分析

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

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

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

源码

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

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

通俗易懂总结

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

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

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

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

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

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

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

标签:
  • 热门焦点
  • JavaScript 混淆及反混淆代码工具

    介绍在我们开始学习反混淆之前,我们首先要了解一下代码混淆。如果不了解代码是如何混淆的,我们可能无法成功对代码进行反混淆,尤其是使用自定义混淆器对其进行混淆时。什么是混
  • CSS单标签实现转转logo

    转转品牌升级后更新了全新的Logo,今天我们用纯CSS来实现转转的新Logo,为了有一定的挑战性,这里我们只使用一个标签实现,将最大化的使用CSS能力完成Logo的绘制与动画效果。新logo
  • K8S | Service服务发现

    一、背景在微服务架构中,这里以开发环境「Dev」为基础来描述,在K8S集群中通常会开放:路由网关、注册中心、配置中心等相关服务,可以被集群外部访问;图片对于测试「Tes」环境或者
  • 一条抖音4亿人围观 ! 这家MCN比无忧传媒还野

    作者:Hiu 来源:互联网品牌官01 擦边少女空降热搜,幕后推手曝光被网友誉为“纯欲天花板”的女网红井川里予,近期因为一组哥特风照片登上热搜,引发了一场互联网世界关于
  • 品牌洞察丨服务本地,美团直播成效几何?

    来源:17PR7月11日,美团App首页推荐位出现“美团直播”的固定入口。在直播聚合页面,外卖“神枪手”直播间、美团旅行直播间、美团买菜直播间等均已上线,同时
  • OPPO K11评测:旗舰级IMX890加持 2000元档最强影像手机

    【Techweb评测】中端机型用户群体巨大,占了中国目前手机市场的大头,一直以来都是各手机品牌的“必争之地”,其中OPPO K系列机型一直以来都以高品质、
  • 苹果MacBook Pro 2021测试:仍不支持平滑滚动

    据10月30日9to5 Mac 消息报道,苹果新的 14 英寸和 16 英寸 MacBook Pro 2021 上市后获得了不错的评价,亮点包括行业领先的性能,令人印象深刻的电池续航,精美丰
  • 三翼鸟智能家居亮相电博会,让用户体验更真实

    2021电博会在青岛国际会展中心开幕中,三翼鸟直接把“家”搬到了现场,成为了展会的一大看点。这也是三翼鸟继9月9日发布了行业首个一站式定制智慧家平台后的
  • 中关村论坛11月25日开幕,15位诺奖级大咖将发表演讲

    11月18日,记者从2022中关村论坛新闻发布会上获悉,中关村论坛将于11月25至30日在京举行。本届中关村论坛由科学技术部、国家发展改革委、工业和信息化部、国务
Top