亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

內存使用情況:nil interface{} 與 struct{}

內存使用情況:nil interface{} 與 struct{}

Go
HUH函數 2023-08-07 15:06:43
我正在嘗試了解有關內存使用的更多信息。對interface{}和struct{}切片進行一些測試,我注意到切片struct{}不分配任何內存,而切片則分配任何內存interface{}。這對我來說沒有多大意義,我實際上期望相同的行為(即兩者都不分配任何內容)。無論如何,我找不到關于這個特殊案例的任何解釋。有人可以解釋一下為什么會發生這種情況嗎?package mainimport (    "runtime"    "fmt")func main() {    // Below is an example of using our PrintMemUsage() function    // Print our starting memory usage (should be around 0mb)    fmt.Println("Start")    PrintMemUsage()    fmt.Println("")    structContainer := make([]struct{}, 1000000)    for i := 0; i<1000000; i++ {    structContainer[i] = struct{}{}    }    fmt.Println("With 1kk struct{}")    PrintMemUsage()    fmt.Println("")    nilContainer := make([]interface{}, 1000000)    for i := 0; i<1000000; i++ {    nilContainer[i] = nil    }    fmt.Println("With 1kk nil interface{}")    PrintMemUsage()    fmt.Println("")}// PrintMemUsage outputs the current, total and OS memory being used. As well as the number // of garage collection cycles completed.func PrintMemUsage() {        var m runtime.MemStats        runtime.ReadMemStats(&m)        // For info on each, see: https://golang.org/pkg/runtime/#MemStats        fmt.Printf("Alloc = %v KiB", bToMb(m.Alloc))        fmt.Printf("\tTotalAlloc = %v KiB", bToMb(m.TotalAlloc))        fmt.Printf("\tSys = %v KiB", bToMb(m.Sys))        fmt.Printf("\tNumGC = %v\n", m.NumGC)}func bToMb(b uint64) uint64 {    return b / 1024}
查看完整描述

2 回答

?
夢里花落0921

TA貢獻1772條經驗 獲得超6個贊

這是因為空結構不包含任何值。

這對于數組或切片來說不是很有用。但它對于地圖很有用。沒有價值的地圖就像一套。您可以插入密鑰并測試它們是否存在。正如您所發現的,缺乏價值可以節省空間。



查看完整回答
反對 回復 2023-08-07
?
慕無忌1623718

TA貢獻1744條經驗 獲得超4個贊

類型變量interface{}可以保存任何值。例如,它可以保存整數8,可以保存string"hi",可以保存結構值image.Point{X: 1, Y: 2}以及幾乎所有其他內容。

如果您分配一個具有interface{}其元素類型的切片,則必須分配內存,以便您可以在其元素中存儲任何值。當使用make()分配它時,它的所有元素都將獲得元素類型的零值(這是nil針對interface{}),但仍然需要分配內存,否則以后將無法設置元素。

另一方面,空結構struct{}沒有字段,它不能保存任何值(除了struct{})。當您分配一個具有struct{}其元素類型的切片時,不需要分配內存,因為您將無法在其中存儲任何需要內存的內容。所以不為這種類型分配內存是一個簡單而聰明的優化。


查看完整回答
反對 回復 2023-08-07
  • 2 回答
  • 0 關注
  • 163 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號