婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Go語言中的內存布局詳解

Go語言中的內存布局詳解

熱門標簽:電銷機器人可以補救房產中介嗎 最短的地圖標注 谷歌便利店地圖標注 百度地圖標注搜索關鍵詞 騰訊外呼系統價格 電梯外呼訪客系統 浙江人工智能外呼管理系統 ?兓? 成都呼叫中心外呼系統平臺

一、go語言內存布局

想象一下,你有一個如下的結構體。

復制代碼 代碼如下:

type MyData struct {
        aByte   byte
        aShort  int16
        anInt32 int32
        aSlice  []byte
}

那么這個結構體究竟是什么呢? 從根本上說,它描述了如何在內存中布局數據。 這是什么意思?編譯器又是如何展現出來呢? 我們來看一下。 首先讓我們使用反射來檢查結構中的字段。

二、反射之上

下面是一些使用反射來找出字段大小及其偏移量(它們相對于結構的開始位于內存中的位置)的代碼。 反射可以告訴我們編譯器是怎么看待類型(包括結構)的。

復制代碼 代碼如下:

// First ask Go to give us some information about the MyData type
typ := reflect.TypeOf(MyData{})
fmt.Printf("Struct is %d bytes long\n", typ.Size())
// We can run through the fields in the structure in order
n := typ.NumField()
for i := 0; i n; i++ {
        field := typ.Field(i)
        fmt.Printf("%s at offset %v, size=%d, align=%d\n",
            field.Name, field.Offset, field.Type.Size(),
            field.Type.Align())
 }

除了每個字段的偏移和大小,我還打印了每個字段的對齊方式,我稍后會解釋。結果如下:

復制代碼 代碼如下:

Struct is 32 bytes long
aByte at offset 0, size=1, align=1
aShort at offset 2, size=2, align=2
anInt32 at offset 4, size=4, align=4
aSlice at offset 8, size=24, align=8

aByte是我們結構體中的第一個字段,偏移量為0.它使用1字節的內存。

aShort是第二個字段。它使用2字節的內存。奇怪的是偏移量是2。這是為什么呢?答案是對齊, CPU更好地訪問位于2字節(“2字節邊界”)的倍數的地址處的2個字節,并訪問位于4字節邊界上的4個字節,直到CPU的自然整數大小,在現代CPU上是8字節(64位)。

在一些較舊的RISC CPU訪問錯誤對齊的數字引起一個故障:在一些UNIX系統上,這將是一個SIGBUS,它會停止你的程序(或內核)。一些系統能夠處理這些錯誤并修復錯誤:您的代碼將運行,但會緩慢的運行,因為額外的代碼將由操作系統運行以修復錯誤。我相信英特爾和ARM的CPU也只是處理芯片上的任何不對齊:也許我們將在以后的文章中測試這一點,以及任何性能的影響。

無論如何,對齊是Go編譯器跳過一個字節放置字段aShort以便它位于2字節邊界的原因。因為這樣,我們可以將另一個字段放進結構體中,而不使它占用更大內存。這里是我們的結構的新版本,在aByte之后立即有一個新字段anotherByte。

復制代碼 代碼如下:

type MyData struct {
       aByte       byte
       anotherByte byte
       aShort      int16
       anInt32     int32
       aSlice      []byte
}

我們再次運行反射代碼,可以看到anotherByte正好在aByte和aShort之間的空閑空間。 它坐落在偏移1,aShort仍然在偏移2.現在可能是時候注意我之前提到的那個神秘對齊字段。 它告訴我們和Go編譯器,這個字段需要如何對齊。

復制代碼 代碼如下:

Struct is 32 bytes long
aByte at offset 0, size=1, align=1
anotherByte at offset 1, size=1, align=1
aShort at offset 2, size=2, align=2
anInt32 at offset 4, size=4, align=4
aSlice at offset 8, size=24, align=8

三、看看內存

然而我們的結構體在內存中到底是什么樣子? 讓我們看看我們能不能找到答案。 首先讓我們構建一個MyData實例,并填充一些值。我選擇了應該容易在內存中找到的值。

復制代碼 代碼如下:

data := MyData{
        aByte:   0x1,
        aShort:  0x0203,
        anInt32: 0x04050607,
        aSlice:  []byte{
                0x08, 0x09, 0x0a,
        },
 }

現在一些代碼訪問組成這個結構的字節。 我們想要獲取這個結構的實例,在內存中找到它的地址,并打印出該內存中的字節。

我們使用unsafe包來幫助我們這樣做。 這讓我們繞過Go類型系統將指向我們的結構的指針轉換為32字節數組,這個數組就是組成我們的結構體的內存數據。

復制代碼 代碼如下:

dataBytes := (*[32]byte)(unsafe.Pointer(data))
fmt.Printf("Bytes are %#v\n", dataBytes)

我們運行以上代碼。 這是結果,第一個字段,aByte,從我們的結構中以粗體顯示。 這是希望你期望的,單字節aByte = 0x01在偏移0。

復制代碼 代碼如下:

Bytes are [32]uint8{**0x1**, 0x0, 0x3, 0x2, 0x7, 0x6, 0x5, 0x4, 0x5a, 0x5, 0x1, 0x20, 0xc4, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}

接下來我們來看看AShort。 這是在偏移量2的位置并且長度為2.如果你記得,aShort = 0x0203,但數據顯示的字節是倒序。 這是因為大多數現代CPU都是Little-Endian:該值的最低位字節首先出現在內存中。

復制代碼 代碼如下:

Bytes are [32]uint8{0x1, 0x0, **0x3, 0x2**, 0x7, 0x6, 0x5, 0x4, 0x5a, 0x5, 0x1, 0x20, 0xc4, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}

同樣的事情發生在Int32 = 0x04050607。 最低位字節首先出現在內存中。

復制代碼 代碼如下:

Bytes are [32]uint8{0x1, 0x0, 0x3, 0x2, **0x7, 0x6, 0x5, 0x4**, 0x5a, 0x5, 0x1, 0x20, 0xc4, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}

四、神秘的插曲

現在我們看到什么? 這是aSlice = [] byte {0x08,0x09,0x0a} ,在偏移量8的24個字節。我沒有看到我的序列0x08,0x09,0x0a的任何地方的任何符號。 這是怎么回事?

復制代碼 代碼如下:

Bytes are [32]uint8{0x1, 0x0, 0x3, 0x2, 0x7, 0x6, 0x5, 0x4, **0x5a, 0x5, 0x1, 0x20, 0xc4, 0x0, 0x0, 0x0, 0x3, 0x0**, **0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0**}

Go反射包里自有答案。 slice在Go語言中由以下結構體表示,該結構從指針數據開始,該數據指向保存切片中的數據的存儲器; 然后是該存儲器中的有用數據的長度Len,以及該存儲器的大小Cap。

復制代碼 代碼如下:

type SliceHeader struct {
        Data uintptr
        Len  int
        Cap  int
}

如果把它提供給我們的代碼,我們得到以下偏移和大小。 數據指針和兩個長度各為8個字節,具有8個字節對齊。

復制代碼 代碼如下:

Struct is 24 bytes long
Data at offset 0, size=8, align=8
Len at offset 8, size=8, align=8
Cap at offset 16, size=8, align=8

如果我們再看一下后面的內存結構,我們可以看到數據是在地址0x000000c42001055a。 之后,我們看到Len和Cap都是3,這是我們的數據的長度。

復制代碼 代碼如下:

Bytes are [32]uint8{0x1, 0x0, 0x3, 0x2, 0x7, 0x6, 0x5, 0x4, **0x5a, 0x5, 0x1, 0x20, 0xc4, 0x0, 0x0, 0x0**, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}

我們可以直接用以下代碼訪問這些數據字節。 首先讓我們直接訪問slice頭,然后打印出數據指向的內存。

復制代碼 代碼如下:

dataslice := *(*reflect.SliceHeader)(unsafe.Pointer(data.aSlice))
fmt.Printf("Slice data is %#v\n",
        (*[3]byte)(unsafe.Pointer(dataslice.Data)))

這是輸出:

復制代碼 代碼如下:

Slice data is [3]uint8{0x8, 0x9, 0xa}

總結

以上就是關于Go語言內存布局的全部內容了,希望本文的內容對大家學習或者使用Go語言能有所幫助,如果有疑問大家可以留言交流。

您可能感興趣的文章:
  • Go pprof內存指標含義備忘錄及案例分析
  • golang切片內存應用技巧詳解
  • 解決golang內存溢出的方法
  • go語言中切片與內存復制 memcpy 的實現操作

標簽:盤錦 眉山 上海 雅安 紹興 七臺河 宜昌 邢臺

巨人網絡通訊聲明:本文標題《Go語言中的內存布局詳解》,本文關鍵詞  語言,中的,內存,布局,詳解,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Go語言中的內存布局詳解》相關的同類信息!
  • 本頁收集關于Go語言中的內存布局詳解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美私人免费视频| 日韩一区有码在线| 午夜精品久久久久影视| 日本一区二区三区四区| 日韩欧美国产综合一区| 亚洲欧美在线观看| 久久精品亚洲精品国产欧美kt∨| 蓝色福利精品导航| 一区二区三区av电影| 亚洲欧美另类久久久精品2019| 欧美激情艳妇裸体舞| 欧美国产乱子伦| 国产精品成人免费| 国产精品电影一区二区| 中文字幕中文字幕中文字幕亚洲无线| 国产肉丝袜一区二区| 久久精品日产第一区二区三区高清版 | 五月天欧美精品| 亚洲成av人片在线观看无码| 亚洲国产成人tv| 欧美无乱码久久久免费午夜一区 | 亚洲人成影院在线观看| 99免费精品在线| 亚洲免费在线视频一区 二区| 亚洲午夜一二三区视频| 精品国产第一区二区三区观看体验| 欧美精品免费视频| 亚洲电影在线免费观看| 日韩美女一区二区三区四区| 蜜臀av国产精品久久久久 | 91激情五月电影| 久久综合九色综合97婷婷| 欧美性色综合网| 99久久久精品| 亚洲午夜免费福利视频| 欧美日韩一区成人| 乱中年女人伦av一区二区| 欧美r级电影在线观看| 欧美性一区二区| 色婷婷国产精品| 欧美日韩激情一区二区三区| 波多野结衣视频一区| 欧美日本一区二区三区四区| 欧美—级在线免费片| 水野朝阳av一区二区三区| 久久精品国产精品亚洲红杏| 亚洲一级二级在线| 开心九九激情九九欧美日韩精美视频电影 | 国产一区二区免费视频| 欧美精品vⅰdeose4hd| 一区二区三区四区高清精品免费观看| 国产精品影音先锋| 91蜜桃在线观看| 免费在线观看视频一区| 99re热这里只有精品视频| 欧美日韩国产综合视频在线观看 | 久久九九全国免费| 国产精品嫩草99a| 99久久99久久免费精品蜜臀| 久久久久国产一区二区三区四区 | 26uuu亚洲综合色| 韩国三级中文字幕hd久久精品| 欧美日韩精品欧美日韩精品| 奇米777欧美一区二区| 欧美日韩综合在线免费观看| 欧美韩日一区二区三区四区| 视频一区二区国产| 国产精品99久久久久久宅男| 91国产视频在线观看| 国产精品家庭影院| 激情久久五月天| 欧美一级搡bbbb搡bbbb| 日韩中文字幕麻豆| 日韩精品一区二区三区三区免费| 日韩极品在线观看| 日韩午夜中文字幕| 国产一区二区美女诱惑| 26uuu欧美| 国产精品一区二区久久精品爱涩| 精品国产制服丝袜高跟| 国产成人小视频| 久久婷婷国产综合国色天香| 国产在线视频一区二区| 国产精品美女久久久久久| 成av人片一区二区| 亚洲成人动漫在线观看| 国产日韩精品一区二区三区在线| 蜜臂av日日欢夜夜爽一区| 国产精品污污网站在线观看| av在线不卡免费看| 天天综合天天做天天综合| 国产亚洲精品资源在线26u| 99视频国产精品| 国产一区二区三区香蕉| 亚洲人成影院在线观看| 欧美日韩精品综合在线| 国产综合久久久久久鬼色| 一区二区三区成人| 国产精品欧美久久久久无广告 | 久久精品免费看| 亚洲精品日产精品乱码不卡| 日韩欧美国产一二三区| 色婷婷一区二区| 亚洲一级二级三级| 欧美国产日韩亚洲一区| 日韩欧美一区二区久久婷婷| 色88888久久久久久影院按摩| 美女一区二区视频| 亚洲午夜久久久久久久久电影网| 久久久久久久综合日本| 欧美精品久久99久久在免费线| 成人午夜大片免费观看| 精品在线播放午夜| 不卡一区二区三区四区| 精品午夜久久福利影院| 九九视频精品免费| 粉嫩蜜臀av国产精品网站| 99精品国产视频| 欧美综合一区二区| 欧美色综合天天久久综合精品| 日韩午夜电影在线观看| 欧美大胆人体bbbb| 日韩欧美国产小视频| 色菇凉天天综合网| 91亚洲精华国产精华精华液| 亚洲国产美女搞黄色| 欧美经典三级视频一区二区三区| 欧美天堂一区二区三区| 成人中文字幕合集| 99视频国产精品| 精品裸体舞一区二区三区| 欧美国产成人在线| 久久这里都是精品| 欧美一级片在线| 91精选在线观看| 日韩午夜在线播放| 欧美在线免费观看视频| 一本一道久久a久久精品综合蜜臀| 国产精品影视网| 波多野结衣精品在线| 欧美日韩一区中文字幕| 91精品国产欧美一区二区成人| 三级影片在线观看欧美日韩一区二区 | 在线免费精品视频| 欧美午夜精品免费| 国产偷国产偷亚洲高清人白洁| 中文字幕日韩av资源站| 国产精品1区2区| 久久综合资源网| 国产色爱av资源综合区| 从欧美一区二区三区| 成人一区二区三区在线观看| 在线影视一区二区三区| 欧美人动与zoxxxx乱| 日本一区免费视频| 午夜精品视频一区| 欧美中文字幕一区| 亚洲乱码精品一二三四区日韩在线| 亚洲最大成人综合| 91丨porny丨户外露出| 欧美国产精品v| 久久激情五月激情| 91精品国产91热久久久做人人 | 在线观看91视频| 午夜亚洲国产au精品一区二区| 制服丝袜一区二区三区| 毛片不卡一区二区| 亚洲欧美视频在线观看视频| 色美美综合视频| 成人综合激情网| 青椒成人免费视频| 亚洲电影激情视频网站| 亚洲摸摸操操av| 亚洲人成网站影音先锋播放| 国产激情一区二区三区| 免费在线观看日韩欧美| 国产欧美日韩另类一区| 成人理论电影网| 亚洲第一主播视频| 久久久久国产精品人| 色综合久久九月婷婷色综合| 性做久久久久久免费观看| 日韩一区二区三区视频在线| 波多野结衣视频一区| 狠狠色狠狠色综合日日91app| 中文字幕在线播放不卡一区| 色国产综合视频| 国产一区二区电影| 亚洲一区自拍偷拍| 久久久久久一级片| 欧美三级日韩在线| 国产福利不卡视频| 日韩二区在线观看| 中文字幕乱码久久午夜不卡 | 欧美一级片在线观看| 色婷婷av一区二区| 日本精品裸体写真集在线观看| 一本色道久久综合狠狠躁的推荐| 久草这里只有精品视频| 国产精品一二二区|