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

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

按值或引用存儲 net.Conn?

按值或引用存儲 net.Conn?

Go
眼眸繁星 2022-10-24 16:51:27
我的應用程序使用 async.Map來存儲通過多個 goroutine 同時訪問的打開的套接字連接。我想知道是將這些連接存儲為結構net.Conn還是引用*net.Conn。這兩種選擇的優(yōu)點/缺點是什么?首選的解決方案是什么?
查看完整描述

1 回答

?
侃侃爾雅

TA貢獻1801條經(jīng)驗 獲得超16個贊

雖然@blackgreen 是正確的,但我會稍微擴展一下推理。

sync.Map類型被明確定義為在 上進行操作interface{}。

現(xiàn)在請記住,在 Go 中,接口不僅僅是類型系統(tǒng)使用的抽象;相反,您可以擁有接口類型的值,并且這些值的內存表示是struct包含兩個指針——指向描述存儲在變量中的值的動態(tài)類型的內部對象,以及指向值本身(或副本它由運行時在堆上創(chuàng)建)。

這意味著,如果您要在 中存儲指向任何內容的指針,則存儲的sync.Map任何此類指針都將被轉換為類型的值,interface{}并且它將在 中占據(jù)完全相同的空間sync.Map
相反,如果您將類型的值net.Conn直接存儲在那里,它們將被直接存儲——僅僅是因為它們已經(jīng)是接口值,所以 Go 只會復制這對指針。

從表面上看,這兩種方法在使用的空間方面都差不多,但請容忍我。
要存儲指向容器數(shù)據(jù)類型(net.Conn例如sync.Map編譯器安排確保原始net.Conn值直接在堆上分配。

換句話說,存儲指向接口類型變量的指針可能(并且通常會——由于典型代碼的組織方式)在內存使用方面更加浪費。

此外,大多數(shù)取消引用(指針追逐)往往會破壞 CPU 緩存;這不會改變游戲規(guī)則,但當您在緊密循環(huán)中迭代集合時可能會增加幾微秒。


話雖如此,我建議不要完全放棄在容器中存儲指針,例如sync.Map:偶爾它會派上用場——例如,為了將數(shù)組重用于切片,您通常存儲指向此類數(shù)組的第一個元素的指針。


查看完整回答
反對 回復 2022-10-24
  • 1 回答
  • 0 關注
  • 100 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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