当前位置: 首页 > 后端技术 > PHP

GoSlice的最大容量是怎么来的

时间:2023-03-29 20:36:11 PHP

原文地址:GoSlice的最大容量是怎么来的前言在《深入理解 Go Slice》中,我们提到了“根据其可申请的最大容量获取最大容量”的处理类型”逻辑。今天我们就来深挖一下底层到底做了什么,涉及到哪些知识点?GoSlice对应的代码如下:funcmakeslice(et*_type,len,capint)slice{maxElements:=maxSliceCap(et.size)iflen<0||uintptr(len)>maxElements{...}如果capmaxElements{...}p:=mallocgc(et.size*uintptr(cap),et,true)returnslice{p,len,cap}}根据你要追求的逻辑定位maxSliceCap方法,会根据当前类型的大小获取最大允许容量,进行阈值判断,即安全检查。这是粗浅的认识,我们继续追下去,看看我们还做了什么?maxSliceCapfuncmaxSliceCap(elemsizeuintptr)uintptr{ifelemsize>63)/2heapAddrBits=(_64bit*(1-sys.GoarchWasm))*48+(1-_64bit+sys.GoarchWasm)*(32-(sys.GoarchMips+sys.GoarchMipsle))maxAlloc=(1<