榆林建站网站建设,中国建设银行信用卡,静态网页设计实训报告,网站首页调用网站标题slice包含3个部分#xff1a; 1.内存的起始位置 2.切片的大小(已经存放的元素数量) 3.容量(可以存放的元素数量)
使用make初始化切片会开辟底层内存#xff0c;并初始化元素值为默认值#xff0c;如数字为0#xff0c;字符串为空
使用New初始化切片不会开辟底层数组…slice包含3个部分 1.内存的起始位置 2.切片的大小(已经存放的元素数量) 3.容量(可以存放的元素数量)
使用make初始化切片会开辟底层内存并初始化元素值为默认值如数字为0字符串为空
使用New初始化切片不会开辟底层数组而且返回的是指向类型的指针
不同的切片可以公用底层数组如
arr : []int{1, 2, 3, 4, 5, 6, 7, 8}arr1 : arr[1:5]这里arr1是从数组下标1~4的引用左闭右开它的大小为4容量到底层数组的结尾即7。 当arr或arr1修改元素的时候底层数组受影响同时作用于两个arr和arr1两个变量。 又或者arr1使用append添加元素的时候由于切片的容量为7所以会直接在底层数组上覆盖原本的元素。但是如果append操作需要扩容的时候并不会在原有的底层数组上直接往后加元素而是复制出来一份到新的内存上所以不会影响原底层数组。
扩容规则 1.预估元素个数 如果扩容前的容量翻倍依旧不能满足所需则直接扩容到所需的容量。 否则如果元素个数1024则直接翻倍如果1024则扩容1.25倍。 否则先判断元素个数256则直接翻倍如果大于等于256会根据const threshold 256;newcap (newcap 3*threshold ) / 4这个公式进行容量预估。如果不能满足所需容量则再次根据此公式循环。相比与之前的1.25倍的容量扩容这个公式提供了一个过度曲线小切片更趋向于2倍大切片更趋向于1.25倍。 2.实际分配内存 程序申请内存并不是需要多少就直接能拿到多少而是从操作系统中拿到满足所需容量的最小内存。比如程序会预先从操作系统中申请163248等等不同规格的内存然后在根据所需容量占据的内存拿到最合适的内存。
例子 []int数组{12}在执行append时arr append(arr, 3, 4, 5)根据1判断需要的容量为564位系统下一个int占64位即8字节。预估需要的内存为5*840字节。但是程序分配内存不会直接分配40字节的内存而是找到满足条件的最小规格内存48字节。48字节可以容纳的元素个数位48/86所以上述实append操作实际上扩容后的容量为6。