欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

slice是如何擴(kuò)容的

本篇內(nèi)容介紹了“slice是如何擴(kuò)容的”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

創(chuàng)新互聯(lián)是一家專業(yè)提供天祝藏族自治企業(yè)網(wǎng)站建設(shè),專注與做網(wǎng)站、網(wǎng)站設(shè)計(jì)、html5、小程序制作等業(yè)務(wù)。10年已為天祝藏族自治眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。

問題1,slice的底層數(shù)據(jù)結(jié)構(gòu)

我擦,這么直接的嘛?

我猜是數(shù)組加鏈表,結(jié)果猜錯(cuò)了0分。

翻看源碼。

runtime/slice.go

type slice struct {
	array unsafe.Pointer  //數(shù)據(jù)結(jié)構(gòu)是簡單粗暴的數(shù)組指針
	len   int
	cap   int
}

問題2,slice是如何擴(kuò)容的

又猜錯(cuò)了~

還是繼續(xù)看源碼吧

從源碼找了半天,發(fā)現(xiàn)一個(gè)這。

growslice handles slice growth during append.

so,就是你了。

func growslice(et *_type, old slice, cap int) slice { // 第三個(gè)cap,新的最小容量
	//巴拉巴拉巴拉 一堆判斷

	newcap := old.cap  //變量存儲(chǔ)空間大小
	doublecap := newcap + newcap  //雙倍空間大小
	if cap > doublecap {  //如果歷史空間大于雙倍的容量,新的最小容量
		newcap = cap
	} else {
		//如果長度小于 1024  新長度就是2倍老容量
		if old.len < 1024 {
			newcap = doublecap
		} else {
			//當(dāng)大于1024 走公式   newcap += newcap / 4,直到newcap大于等于老cap
			for 0 < newcap && newcap < cap {
				newcap += newcap / 4
			}
			if newcap <= 0 {
				newcap = cap
			}
		}
	}

	var overflow bool
	var lenmem, newlenmem, capmem uintptr
	//對(duì)et的size做匹配,獲取需要申請(qǐng)的空間大小
	//1 不處理直接分配
	//系統(tǒng)指針大小 進(jìn)行計(jì)算和位運(yùn)算
	//2 唯一運(yùn)算
	//默認(rèn) 相乘
	switch {
	case et.size == 1:
		lenmem = uintptr(old.len)
		newlenmem = uintptr(cap)
		capmem = roundupsize(uintptr(newcap))
		overflow = uintptr(newcap) > maxAlloc
		newcap = int(capmem)
	case et.size == sys.PtrSize:
		lenmem = uintptr(old.len) * sys.PtrSize
		newlenmem = uintptr(cap) * sys.PtrSize
		capmem = roundupsize(uintptr(newcap) * sys.PtrSize)
		overflow = uintptr(newcap) > maxAlloc/sys.PtrSize
		newcap = int(capmem / sys.PtrSize)
	case isPowerOfTwo(et.size):
		var shift uintptr
		if sys.PtrSize == 8 {
			// Mask shift for better code generation.
			shift = uintptr(sys.Ctz64(uint64(et.size))) & 63
		} else {
			shift = uintptr(sys.Ctz32(uint32(et.size))) & 31
		}
		lenmem = uintptr(old.len) << shift
		newlenmem = uintptr(cap) << shift
		capmem = roundupsize(uintptr(newcap) << shift)
		overflow = uintptr(newcap) > (maxAlloc >> shift)
		newcap = int(capmem >> shift)
	default:
		lenmem = uintptr(old.len) * et.size
		newlenmem = uintptr(cap) * et.size
		capmem, overflow = math.MulUintptr(et.size, uintptr(newcap))
		capmem = roundupsize(capmem)
		newcap = int(capmem / et.size)
	}

	//如果append一次超過過多的元素新增,直接報(bào)錯(cuò),越界,超出容量大小
	if overflow || capmem > maxAlloc {
		panic(errorString("growslice: cap out of range"))
	}

	var p unsafe.Pointer //申請(qǐng)新的內(nèi)存,并把指針指向p
	if et.ptrdata == 0 {
		p = mallocgc(capmem, nil, false)
		memclrNoHeapPointers(add(p, newlenmem), capmem-newlenmem)
	} else {
		p = mallocgc(capmem, et, true)
		if lenmem > 0 && writeBarrier.enabled {
			bulkBarrierPreWriteSrcOnly(uintptr(p), uintptr(old.array), lenmem)
		}
	}
	//將老的數(shù)據(jù)移動(dòng)到新的數(shù)據(jù)
	memmove(p, old.array, lenmem)

	return slice{p, old.len, newcap}
}

總結(jié)

其實(shí)可以看出,golang的切片擴(kuò)容是比較粗暴的,直接賦值拷貝。不過,golang區(qū)分的長度和容量兩種單位計(jì)量,一般會(huì)提前分配足夠的cap,可以減少maclloc的次數(shù)。

“slice是如何擴(kuò)容的”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

文章題目:slice是如何擴(kuò)容的
文章來源:http://aaarwkj.com/article26/gghjjg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)網(wǎng)站營銷、網(wǎng)站導(dǎo)航、網(wǎng)站制作移動(dòng)網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)
91大神九色在线观看| 日本在线中文字幕乱码| 国产亚洲美女在线视频视频| 国产免费看黄色的网站| 国产三级伦理在线播放| 午夜看片福利欧美熟女| 国产精品黄色91熟女| 国产毛片久久久久久国产| 亚洲日本韩国福利久久| 亚洲国产免费一区二区| 国产精品日韩一区视频| 九九九热免费在线观看| 日韩亚洲欧美国产另类| 粗长挺进新婚人妻诗岚| 午夜少妇诱惑一区二区三区| 亚洲各类熟女们中文字幕| 日韩在线观看视频有码| 国产色综合一区二区| 日韩人妻系列在线观看| 国产欧美成人综合色就色| 欧美日韩在线视频一区| 我要看黄色一级性生活片| 国产精品一区二区av麻豆| av在线男人社区日韩| 精品人妻一区三区蜜桃| 日本av东京热在线播放| 日本加勒比中文在线观看| 国产麻豆剧传媒国产av| 亚洲欧美另类不卡专区| 国产国产精品人在线观看| 国产福利在线观看午夜| 美女午夜精品国产福利| 日本高清av一区二区| 日本中文字幕三级专区| 最新人妻少妇精品中文字幕视频| 免费国产三级在线观看| 妇女人妻丰满少妇中文字幕| 东京一区二区三区四区黄片| 日韩国产欧美亚州精品| 欧美视频免费一级黄片| 午夜精品久久久免费视频 |