国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Go 內存分配:結構體中的優化技巧

開發 前端
為什么字段c的偏移量是24?字段b中的字符串看起來比16個字節要長得多,如果字符串的偏移量是8,那么字段c的偏移量應該更大一些。

在使用Golang進行內存分配時,我們需要遵循一系列規則。在深入了解這些規則之前,我們需要先了解變量的對齊方式。

Golang的unsafe包中有一個函數Alignof,簽名如下:

func Alignof(x ArbitraryType) uintptr

對于任何類型為v的變量x,AlignOf函數會返回該變量的對齊方式。我們將對齊方式記為m。現在,Golang確保m是滿足變量x的內存地址 % m == 0的最大可能數,也就是說,變量x的內存地址是m的倍數。

讓我們來看看一些數據類型的對齊方式:

  • byte, int8, uint8 -> 1
  • int16, uint16 -> 2
  • int32, uint32, float32, complex64 -> 4
  • int, int64, uint64, float64, complex128 -> 8
  • string, slice -> 8

對于結構體中的字段,行為可能會有所不同,詳細信息請參考包的文檔。

為了更好地理解結構體內存分配的情況,我們將使用unsafe包中的另一個函數Offsetof。該函數返回字段相對于結構體起始位置的位置,換句話說,它返回字段起始位置與結構體起始位置之間的字節數。

func Offsetof(x ArbitraryType) uintptr

為了更好地理解結構體內存分配,讓我們以一個示例結構體為例:

type Example struct {
    a int8
    b string
    c int8
    d int32
}

現在,我們將找出類型為Example的變量所占用的總內存,并嘗試優化分配。

var v = Example{
    a: 10,
    b: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus rhoncus.",
    c: 20,
    d: 100,
}
fmt.Println("字段a的偏移量:", unsafe.Offsetof(v.a)) // 輸出:0
fmt.Println("字段b的偏移量:", unsafe.Offsetof(v.b)) // 輸出:8
fmt.Println("字段c的偏移量:", unsafe.Offsetof(v.c)) // 輸出:24
fmt.Println("字段d的偏移量:", unsafe.Offsetof(v.d)) // 輸出:28

現在,問題出現了:“為什么結構體中字段b的偏移量是8?它應該是1,因為字段a的類型是int8,只占用1個字節。”回到字符串數據類型的對齊方式,它的值為8,這意味著地址需要被8整除,因此在其中插入了7個字節的“填充”,以確保這種行為。

為什么字段c的偏移量是24?字段b中的字符串看起來比16個字節要長得多,如果字符串的偏移量是8,那么字段c的偏移量應該更大一些。

上述問題的答案是,在Go中,字符串并不是在結構體內的同一位置分配內存的。有一個單獨的數據結構來保存字符串描述符,并且該字符串描述符以原地方式存儲在結構體中,用于類型為string的字段,該描述符的大小為16個字節。

現在,讓我們來看看unsafe包中的另一個函數Sizeof。正如其名稱所示,該函數估計并返回類型為x的變量所占用的字節數。

注意:它是根據結構體中可能存在的不同大小的字段來估計大小的。

func Sizeof(x ArbitraryType) uintptr

現在,讓我們來看看我們的結構體Example的大小。

fmt.Println("Example的大小:", unsafe.Sizeof(v)) // 輸出:32

我們如何優化這個結構體以最小化填充呢?

為了優化這個結構體的內存,我們將查看不同數據類型的對齊方式,并嘗試減少填充。讓我們嘗試將兩個int8類型的字段放在一起。

type y struct {
    a int8
    c int8
    b string
    d int32
}

var v = y{}
fmt.Println("字段a的偏移量:", unsafe.Offsetof(v.a)) // 輸出:0
fmt.Println("字段b的偏移量:", unsafe.Offsetof(v.b)) // 輸出:8
fmt.Println("字段c的偏移量:", unsafe.Offsetof(v.c)) // 輸出:1
fmt.Println("字段d的偏移量:", unsafe.Offsetof(v.d)) // 輸出:24
fmt.Println("Example的大小:", unsafe.Sizeof(v)) // 輸出:32

太棒了,我們去掉了一些填充,但是為什么大小仍然是32?大小應該是1(a)+ 1(c)+ 6(填充)+ 16(b)+ 4(d)= 28

現在,當結構體的最后一個字段與架構的對齊要求不完全一致時,會在最后一個字段之后添加填充,以確保結構體的整體大小是其字段中最大對齊要求的倍數。因為字符串數據類型的最大對齊方式為8,所以額外添加了填充,使大小成為8的倍數,即在末尾填充了4個字節,使大小為32字節。

我們能否進一步減少填充,使其更加優化?

讓我們嘗試通過移動字段位置來實現。

type y struct {
    b string
    d int32
    a int8
    c int8
}

var v = y{}
fmt.Println("字段a的偏移量:", unsafe.Offsetof(v.a)) // 輸出:20
fmt.Println("字段b的偏移量:", unsafe.Offsetof(v.b)) // 輸出:0
fmt.Println("字段c的偏移量:", unsafe.Offsetof(v.c)) // 輸出:21
fmt.Println("字段d的偏移量:", unsafe.Offsetof(v.d)) // 輸出:16
fmt.Println("Example的大小:", unsafe.Sizeof(v)) // 輸出:24

我們可以看到,通過重新排列字段的位置,使得對齊需要最小化填充,我們已經將結構體的大小從32減小到24,這是內存優化的巨大進步,達到了25%。

當前的內存占用是16(b)+ 4(d)+ 1(a)+ 1(b)+ 2(填充)。

遺憾的是,由于語言和架構的限制,我們無法進一步去除填充。

責任編輯:武曉燕 來源: 愛發白日夢的后端
相關推薦

2021-12-20 07:59:07

Go語言結構體

2020-12-02 09:10:22

Go結構數據類型

2021-04-20 09:00:48

Go 語言結構體type

2021-02-28 13:22:54

Java內存代碼

2023-07-29 15:03:29

2021-01-06 09:47:51

內存Go語言

2023-10-10 13:58:00

C語言代碼結構體

2010-02-04 14:58:06

C++內存分配

2010-08-10 10:17:44

Flex內存

2021-12-21 08:51:13

Go數據Model

2011-08-10 09:06:44

內存內存優化

2021-11-02 14:54:41

Go結構體標簽

2020-05-06 18:53:23

Go編程語言

2023-01-10 09:18:37

Go內存分配逃逸

2021-11-02 12:19:18

Go函數結構

2022-11-30 08:19:15

內存分配Go逃逸分析

2024-01-15 11:12:28

Go內存開發

2023-01-28 08:32:04

Go內存分配

2020-11-23 08:54:14

Go語言結構體

2020-12-02 08:45:36

Go語言
點贊
收藏

51CTO技術棧公眾號

成人在线视频一区二区| 1区2区3区欧美| 欧美精品在欧美一区二区少妇| 在线观看亚洲色图| 亚洲日本国产| 91色中文字幕| 欧美在线电影| 欧美一区亚洲一区| 精品国产第一国产综合精品| 91精品国产欧美一区二区成人| 可播放的18gay1069| 国产午夜亚洲精品理论片色戒| 污污污污污污www网站免费| 日本欧美一区二区在线观看| 国产乱子伦精品| 亚洲一级淫片| 147欧美人体大胆444| 亚洲3atv精品一区二区三区| 一区二区高清视频| 国模精品一区二区三区色天香| 另类激情视频| 福利在线小视频| 熟妇人妻va精品中文字幕 | 亚洲毛片免费看| 性色av一区二区咪爱| 色猫av在线| 国产一区二区三区黄视频| 欧美日韩亚洲一区二| 97香蕉久久| 亚洲主播在线播放| 亚洲高清福利| 色婷婷精品大在线视频| av在线免费一区| 日韩精品一区二区三区三区免费 | 国产成人精品一区二区三区四区| 一级特黄录像免费播放全99| 麻豆久久一区二区| 999一区二区三区| 久久久久久久久久久电影| 激情亚洲综合网| 欧美日韩国产色| a级网站在线播放| 亚洲香蕉成人av网站在线观看| 国产一区二区黄色| 国产欧美日韩精品一区二区三区| 国产自摸综合网| 国产美女精品| av在线免费观看国产| 中文在线资源观看网站视频免费不卡| 毛片毛片毛片毛片| 91成人在线免费观看| 青青草视频在线免费直播| 国产一区二区日韩| 亚洲尤物av| 久久伊人一区二区| 99免费精品视频| 白虎精品一区| 日韩av中文字幕在线| 国产精伦一区二区三区| 51成人做爰www免费看网站| 国产一区二区三区国产| 性直播在线观看| 林ゆな中文字幕一区二区| 免费在线成人av电影| 一区二区三区导航| 国产精品第一第二| 久久黄色影院| 免费成人午夜视频| 一区二区三区产品免费精品久久75| 黄色小视频在线免费观看| 日韩电影中文 亚洲精品乱码| 久久久久97| 麻豆91av| 亚洲国产精品成人综合| 老司机免费在线视频| 久久99精品久久久久久琪琪| 欧美日韩福利| 国产免费一区二区三区视频| 欧美视频一区二区三区…| 久久久国产成人精品| 综合激情网站| 精品福利视频导航大全| 日韩成人中文字幕在线观看| 麻豆国产一区| 日本一区视频在线观看| 亚洲色图清纯唯美| xx欧美视频| 亚洲精品一区二区毛豆| 国产成人精品免费视频| 99热这里只有成人精品国产| 婷婷丁香激情网| 日韩一区二区影院| 九九综合九九| 国产69精品久久久久久久| 欧美日韩久久久一区| 精品视频在线你懂得| 欧美另类网站| 亚洲一区二区三区四区的| 成人视屏在线观看| 亚洲国产精品va在线看黑人| 国产高潮在线| 亚洲美女av在线播放| 亚洲动漫在线观看| 成年人免费大片| 国产精品电影| 国产伦精品免费视频| 久久久久久亚洲综合影院红桃| 在线观看视频免费| 日韩午夜激情视频| 精品少妇一区| 日本www在线视频| 精品亚洲男同gayvideo网站| 欧美不卡高清一区二区三区| 国产欧美精品在线播放| 亚洲女同中文字幕| 国产精品二区在线观看| 美国欧美日韩国产在线播放| 免费成人进口网站| 国产精品欧美综合在线| 久久伊人国产| 亚洲欧美久久234| 3d成人动漫网站| 日本亚洲视频在线| 97色婷婷成人综合在线观看| a级黄色片网站| 性感美女极品91精品| 日韩少妇内射免费播放18禁裸乳| 日韩女优av电影| 亚洲日本国产| 久热国产在线| 精品午夜一区二区| 欧美性猛片aaaaaaa做受| 亚洲综合激情在线| 欧美一区二区视频| 国产精品乱码视频| 91精品黄色片免费大全| 在线成人亚洲| 97caopron在线视频| 亚洲欧美日韩国产yyy| 亚洲国产成人av在线| 国产老肥熟一区二区三区| 欧美在线va视频| 日韩免费高清在线| 日韩免费在线看| 亚洲一区二区3| 亚洲第一毛片| 24小时免费看片在线观看| 国产成人三级视频| 中文字幕av一区二区| 久久亚洲综合色一区二区三区| 91麻豆精品激情在线观看最新| 色国产在线视频| 国产精品99久久久久久白浆小说| 亚洲精品一二三四区| 欧美激情国产在线| 一区二区三区视频网站| 性欧美精品一区二区三区在线播放 | 最新天堂中文在线| 国产精品午夜国产小视频| 欧美日韩美女在线观看| 亚洲激情成人| 欧美黄色三级| xxav视频| 久久综合入口| 久久久精品美女| 欧美日韩国产色视频| 久久精品亚洲一区二区| 欧美羞羞视频| 国产三级免费观看| 激情伦成人综合小说| 亚洲男子天堂网| 国产精品嫩草99a| 国产综合精品| av成人免费看| 激情五月开心婷婷| 97人人做人人人难人人做| 亚洲福利小视频| 国产精品美女视频| 国产精品日本欧美一区二区三区| 2019年精品视频自拍| 中文产幕区在线观看| 9191国产视频| 国产精品久久网| 亚洲精品99久久久久中文字幕| 国产精品成人网| 免费高清在线视频一区·| 日韩成人动漫在线观看| 日本一本在线免费福利| 导航艳情国产电影| xxxxxx在线观看| 国产综合久久久久久| 国产一区二区美女视频| 在线欧美日韩国产| 国产欧美一区二区精品仙草咪| 久久九九精品| 色综合咪咪久久网| 国产亚洲观看| 黑人玩欧美人三根一起进| 922tv免费观看在线| 成人免费观看cn|