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

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

內(nèi)存使用情況:nil interface{} 與 struct{}

內(nèi)存使用情況:nil interface{} 與 struct{}

Go
HUH函數(shù) 2023-08-07 15:06:43
我正在嘗試了解有關(guān)內(nèi)存使用的更多信息。對interface{}和struct{}切片進(jìn)行一些測試,我注意到切片struct{}不分配任何內(nèi)存,而切片則分配任何內(nèi)存interface{}。這對我來說沒有多大意義,我實際上期望相同的行為(即兩者都不分配任何內(nèi)容)。無論如何,我找不到關(guān)于這個特殊案例的任何解釋。有人可以解釋一下為什么會發(fā)生這種情況嗎?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貢獻(xiàn)1772條經(jīng)驗 獲得超6個贊

這是因為空結(jié)構(gòu)不包含任何值。

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



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

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

類型變量interface{}可以保存任何值。例如,它可以保存整數(shù)8,可以保存string"hi",可以保存結(jié)構(gòu)值image.Point{X: 1, Y: 2}以及幾乎所有其他內(nèi)容。

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

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


查看完整回答
反對 回復(fù) 2023-08-07
  • 2 回答
  • 0 關(guān)注
  • 170 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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