我有一個程序,我將在其中制作很多切片,其中一些可能是空的:nb := something() // something might return 0slices = append(slices, make([]int, nb))是否make([]int, 0)分配了一些內存,因此nil盡管它們共享相同的行為,但內存效率不如切片?到多少?如果是這樣,是否值得進行測試以避免無用的分配,或者測試的 CPU 時間成本是否不值得節省內存(或任何其他不這樣做的原因)?var sl slicenb := something()if nb > 0 { sl = make([]int, nb)}slices = append(slices, sl)
2 回答
寶慕林4294392
TA貢獻2021條經驗 獲得超8個贊
之間分配的內存沒有區別
var a []T // nil slice
和
a := make([]T, 0) // zero-length, zero-capacity, non-nil slice
不同之處在于切片標頭內容。在第二種情況下,切片指針包含一些固定地址,對于所有 0 大小的分配都是相同的。
如果此代碼位于程序的性能關鍵部分,則差異會產生……相當大的差異。在第一種情況下,您將切片標頭歸零,在第二種情況下,您會經歷 3-4 次函數調用,在 malloc 返回指向零基的指針之前,對 cap 和 length 進行一些范圍檢查等。
繁花不似錦
TA貢獻1851條經驗 獲得超4個贊
make([]int, 0) 是否分配了一些內存
是的,它分配了一個切片頭,但沒有后備數組。如果切片頭沒有轉義當前范圍,它可能會在堆棧上分配。
內存效率低于零切片
在使用的內存方面,它們是相同的。
是否值得進行測試以避免無用的分配
一般來說,與執行內存分配和初始化所需的周期相比,比較 int 所需的 3 或 4 條指令算不了什么。
- 2 回答
- 0 關注
- 292 瀏覽
添加回答
舉報
0/150
提交
取消
