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

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

為什么 Go 經常將字符串的數據存儲在未對齊的地址

為什么 Go 經常將字符串的數據存儲在未對齊的地址

Go
函數式編程 2022-05-18 17:03:20
我已經閱讀了很多關于內存中值對齊的重要性的內容,因為訪問未對齊的地址可能會減慢操作速度,或者顯然根本不起作用,具體取決于 CPU 架構(參考https://syslog.ravelin.com/ go-and-memory-layout-6ef30c730d51)。但后來我注意到,在 Go 中實例化一個簡單的字符串時,它經常將字符串值存儲在未對齊的地址中。這可以通過運行以下代碼看到:package mainimport (    "fmt"    "unsafe"    "reflect")func main() {    testString:= "testString"    fmt.Println(fmt.Sprintf("Data is at address %d", ((*reflect.StringHeader)(unsafe.Pointer(&testString))).Data))}在https://play.golang.org/p/d1eX0nP3AgV上運行它時,我不斷得到:Data is at address 11403051140305顯然不能被4or整除8。有人可以解釋一下為什么 Go 將該值存儲在一個未對齊的地址中嗎?使用對齊的不是更好嗎?這僅僅是為了不浪費空間,同時依靠現代 CPU 可以處理它的事實?;蛘呤且驗樘摂M內存層抽象了物理內存地址,實際上物理地址是正確對齊的?
查看完整描述

1 回答

?
萬千封印

TA貢獻1891條經驗 獲得超3個贊

您是對的,32 位值(例如整數)應該在 4 字節邊界上對齊,否則訪問它可能需要兩次內存訪問而不是一次。類似地,64 位值應該在 8 字節邊界上對齊,盡管在 32 位系統(即 32 條數據線到內存)中,4 字節邊界就足夠了,因為無論如何都需要兩次內存訪問。

然而,Go 中字符串的數據實際上是一個字節數組,因此沒有對齊要求。如果您在 C 中打印字符串的地址,您會發現同樣的事情(出于效率原因,它非常關心對齊)。

一旦你理解了對齊,它就相當簡單,但需要大量解釋。我在http://devmethodologies.blogspot.com/2013/04/alignment-and-pragma-pack.html上寫過它(針對 C 語言)。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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