当前位置: 首页 > news >正文

辽宁建设工程信息网b类项目搜索引擎优化实训心得

辽宁建设工程信息网b类项目,搜索引擎优化实训心得,图标设计免费 logo,h5互动网站建设slice golang-slice语雀笔记整理 slicego为何设计slice?引用传递实现扩容机制 go为何设计slice? 切片对标其他语言的动态数组,底层通过数组实现,可以说是对数组的抽象,底层的内存是连续分配的所以效率高,可…

slice


golang-slice语雀笔记整理

  • slice
    • go为何设计slice?
    • 引用传递实现
    • 扩容机制

go为何设计slice?

切片对标其他语言的动态数组,底层通过数组实现,可以说是对数组的抽象,底层的内存是连续分配的所以效率高,可以通过索引查找。
image.png
**有数组了为何还要切片? **

  1. 数组长度固定,切片动态扩容,更加灵活
  2. golang官方文档明确说了go只有值传递,而通过切片可通过值传递实现引用传递

所以切片的核心在于它如何实现引用传递、 以及 切片的扩容机制

引用传递实现

切片实现引用传递主要还是跟它的数据结构有关。 在slice的结构体中有3个字段, array, len, cap; 其中的array指向底层数组开始的内存。 那么值传递的时候传的内存区域其实是同一块。此时虽然对副本修改,但实际上改的是同一块内存上的数据,就实现了引用传递。 但是对副本修改len和cap,原始数据len和cap是不会变的,比如传递切片给函数,函数内部append(s,100),输出一下s是看不到这个100的,因为输出s时是输出len个元素,len没变。

扩容机制

1.19下slice.go下的grouslice方法源码

扩容的触发时机:len跟cap相等时,下次append就是触发扩容。阅读slice.go下的growslice方法源码,可以分析slice扩容机制。
首先是计算new cap大小:
判断新申请空间是否大于 2 * old cap,如果是,那就直接使用new cap;
如果不是,判断old cap 小于 256 ?如果是,直接使用2* old cap作为new cap,如果不是,则在一个for循环里面不断给old cap扩容1/4,并且+192,直到cap 满足new cap。 这样的扩容更加平滑
根据new cap ,计算需要分配的内存大小:比如newcap * 元素大小(比如int就是newcap*8byte),向上取整推算mspan对应等级,对新切片进行初始化,然后调用memmove方法,将老切片内容拷贝到新切片并且返回。

我觉得go的切片扩容策略相比C++更加的平滑,初始阶段的扩容迅速,后面的增加更省内存。像C++的vector的话linux下1.5倍考虑到内存的复用,win+vs下2倍,是固定的倍数扩容;

http://www.hkea.cn/news/437121/

相关文章:

  • 淘宝上成都网站建设如何制作视频网站
  • 最吃香的男生十大手艺5g网络优化
  • 河源哪里做网站网络项目怎么推广
  • 网站闭关保护怎么做广州百度seo 网站推广
  • 可以在线做动图的网站近期重大新闻事件
  • 伊犁州建设局网站怎么做微信小程序
  • 做网站需要买主机那新媒体营销方式有几种
  • 网络推广seo公司seo排名的方法
  • 南山做网站多少钱百度资讯
  • 西安哪里有做网站的小学生收集的新闻10条
  • 做游戏网站有几个要素seo网站关键词优化报价
  • 蓬业东莞网站建设技术支持东莞做网站公司首选
  • 网站版式设计获客渠道有哪些
  • 今日军事新闻简短扬州seo优化
  • 国外好看的教育类网站模板下载东莞做网站最好的是哪家
  • 微擎与wordpress快速优化seo软件推广方法
  • 英文网站设计哪家好免费网站搭建
  • 网站建设公司 销量深圳谷歌seo公司
  • 新蔡哪有做网站建设的全球疫情今天最新消息
  • 怎么做平台网站百度seo报价方法
  • 帮人做网站 怎么收费怎么用网络推广
  • 网站排名优化建设百度广告投放技巧
  • 文件服务器网站搭建教程好的竞价托管公司
  • 黑龙江省城乡和住房建设厅网站首页百度链接地址
  • 网站模板修改工具专业seo关键词优化
  • 口碑好的句容网站建设yahoo搜索
  • 深圳网站建设外贸公司价格网络营销的背景和意义
  • 长春网站建设硕成传媒seo快速排名优化公司
  • web网站开发能使用c 吗免费建立个人网站申请
  • 织梦网站修改教程视频网站优化培训学校