第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

為什么奇數(shù)的切片容量與偶數(shù)的行為不同

為什么奇數(shù)的切片容量與偶數(shù)的行為不同

Go
暮色呼如 2021-11-15 15:23:38
我注意到當(dāng)容量為奇數(shù)時(shí),切片的容量以不同的方式表現(xiàn)。更具體地說(shuō):當(dāng)一個(gè)元素添加到切片時(shí),當(dāng)原始容量為偶數(shù)時(shí),切片的容量增加一倍。但是當(dāng)原始容量為奇數(shù)時(shí),容量增加一然后翻倍。例子:s := make([]int, 28, 28)s = append(s, 1) fmt.Println("len=", len(s), " cap=", cap(s)) // len = len + 1, cap = 2 * cappri := make([]int, 27, 27)pri = append(pri, 1)fmt.Println("len=", len(pri), " cap=", cap(pri)) // len = len + 1, cap = 2 * (cap + 1)  假設(shè)這不是錯(cuò)誤,這種行為的原因是什么?游樂(lè)場(chǎng)鏈接:http : //play.golang.org/p/wfmdobgCUF
查看完整描述

1 回答

?
慕虎7371278

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超4個(gè)贊

簡(jiǎn)答

它正在舍入切片容量以填充分配的內(nèi)存塊。


長(zhǎng)答案

讓我們來(lái)看看 Go1.5.1 源代碼:


https://github.com/golang/go/blob/f2e4c8b5fb3660d793b2c545ef207153db0a34b1/src/cmd/compile/internal/gc/walk.go#L2895告訴我們append(l1, l2...)擴(kuò)展為


s := l1

if n := len(l1) + len(l2) - cap(s); n > 0 {

    s = growslice_n(s, n)

}

s = s[:len(l1)+len(l2)]

memmove(&s[len(l1)], &l2[0], len(l2)*sizeof(T))

我們感興趣的部分growslice_n,在那里定義:https : //github.com/golang/go/blob/f2e4c8b5fb3660d793b2c545ef207153db0a34b1/src/runtime/slice.go#L36


再深入一點(diǎn),我們發(fā)現(xiàn):


newcap := old.cap

if newcap+newcap < cap {

    newcap = cap

} else {

    for {

        if old.len < 1024 {

            newcap += newcap

        } else {

            newcap += newcap / 4

        }

        if newcap >= cap {

            break

        }

    }

}


/* [...] */


capmem := roundupsize(uintptr(newcap) * uintptr(et.size))

newcap = int(capmem / uintptr(et.size))

roundupsize在那里定義:https : //github.com/golang/go/blob/f2e4c8b5fb3660d793b2c545ef207153db0a34b1/src/runtime/msize.go#L178


// Returns size of the memory block that mallocgc will allocate if you ask for the size.

func roundupsize(size uintptr) uintptr {

    if size < _MaxSmallSize {

        if size <= 1024-8 {

            return uintptr(class_to_size[size_to_class8[(size+7)>>3]])

        } else {

            return uintptr(class_to_size[size_to_class128[(size-1024+127)>>7]])

        }

    }

    if size+_PageSize < size {

        return size

    }

    return round(size, _PageSize)

}

它是在那里介紹的:https : //groups.google.com/forum/#!topic/golang-codereviews/bFGtI4Cpb_M


增長(zhǎng)切片時(shí)要考慮分配的內(nèi)存塊的大小。


查看完整回答
反對(duì) 回復(fù) 2021-11-15
  • 1 回答
  • 0 關(guān)注
  • 219 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)