2 回答

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超3個贊
這是我的理解:
你可以看作slice
是struct
其中的length
一員。
函數(shù)所做的唯一事情len()
就是讀取 的該成員type slice struct
,因此無需擔(dān)心其性能——它與讀取您length int
自己創(chuàng)建的成員一樣快。

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超8個贊
所有內(nèi)置函數(shù)實(shí)際上都不起作用。它可能是一堆其他函數(shù)或只是一個 asm 指令(就本例而言)。
這是切片結(jié)構(gòu):
type SliceHeader struct {
Data uintptr // sizeof(uintptr) = 8 byte
Len int
Cap int
}
要獲取切片的 len,我們應(yīng)該獲取切片指針的偏移量。Go 慣用變體如下所示:
*(*int)(unsafe.Pointer(uintptr(pointer_to_slice) + 8))
可以看到,len(b)的輸出goasm代碼等于一條指令: https://godbolt.org/z/z0PtMe
var b1 = []byte{1, 2, 3}
var b2 = []byte{4, 5, 6}
func main() {
l1 := len(b1)
if len(b2) == l1 {
println(l1)
} else {
println(len(b2))
}
}
l1 := len(b1)
=
movq "".b1+8(SB), AX // ax == l1
但是,對于len(b2) == l1編譯器創(chuàng)建附加變量:
movq "".b2+8(SB), CX // cx == len(b2) in "if" statement
因此,我們可以得出結(jié)論,為長度創(chuàng)建新變量不會影響性能。
- 2 回答
- 0 關(guān)注
- 140 瀏覽
添加回答
舉報(bào)