站長資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

        字節(jié)對齊在golang中的使用詳解

        本文由go語言教程欄目給大家介紹golang 字節(jié)對齊,希望對需要的朋友有所幫助!

        最近在做一些性能優(yōu)化的工作,其中有個結(jié)構(gòu)體占用的空間比較大,而且在內(nèi)存中的數(shù)量又特別多,就在想有沒有優(yōu)化的空間,想起了 c 語言里面的字節(jié)對齊,通過簡單地調(diào)整一下字段的順序,就能省出不少內(nèi)存,這個思路在 golang 里面同樣適用

        基本數(shù)據(jù)大小

        在這之前先來看下 golang 里面基本的類型所占數(shù)據(jù)的大小

        So(unsafe.Sizeof(true), ShouldEqual, 1) So(unsafe.Sizeof(int8(0)), ShouldEqual, 1) So(unsafe.Sizeof(int16(0)), ShouldEqual, 2) So(unsafe.Sizeof(int32(0)), ShouldEqual, 4) So(unsafe.Sizeof(int64(0)), ShouldEqual, 8) So(unsafe.Sizeof(int(0)), ShouldEqual, 8) So(unsafe.Sizeof(float32(0)), ShouldEqual, 4) So(unsafe.Sizeof(float64(0)), ShouldEqual, 8) So(unsafe.Sizeof(""), ShouldEqual, 16) So(unsafe.Sizeof("hello world"), ShouldEqual, 16) So(unsafe.Sizeof([]int{}), ShouldEqual, 24) So(unsafe.Sizeof([]int{1, 2, 3}), ShouldEqual, 24) So(unsafe.Sizeof([3]int{1, 2, 3}), ShouldEqual, 24) So(unsafe.Sizeof(map[string]string{}), ShouldEqual, 8) So(unsafe.Sizeof(map[string]string{"1": "one", "2": "two"}), ShouldEqual, 8) So(unsafe.Sizeof(struct{}{}), ShouldEqual, 0)
        • bool 類型雖然只有一位,但也需要占用1個字節(jié),因為計算機是以字節(jié)為單位
        • 64為的機器,一個 int 占8個字節(jié)
        • string 類型占16個字節(jié),內(nèi)部包含一個指向數(shù)據(jù)的指針(8個字節(jié))和一個 int 的長度(8個字節(jié))
        • slice 類型占24個字節(jié),內(nèi)部包含一個指向數(shù)據(jù)的指針(8個字節(jié))和一個 int 的長度(8個字節(jié))和一個 int 的容量(8個字節(jié))
        • map 類型占8個字節(jié),是一個指向 map 結(jié)構(gòu)的指針
        • 可以用 struct{} 表示空類型,這個類型不占用任何空間,用這個作為 map 的 value,可以講 map 當做 set 來用

        字節(jié)對齊

        結(jié)構(gòu)體中的各個字段在內(nèi)存中并不是緊湊排列的,而是按照字節(jié)對齊的,比如 int 占8個字節(jié),那么就只能寫在地址為8的倍數(shù)的地址處,至于為什么要字節(jié)對齊,主要是為了效率考慮,而更深層的原理看了一下網(wǎng)上的說法,感覺不是很靠譜,就不瞎說了,感興趣可以自己研究下

        // |x---| So(unsafe.Sizeof(struct {     i8 int8 }{}), ShouldEqual, 1)

        簡單封裝一個 int8 的結(jié)構(gòu)體,和 int8 一樣,僅占1個字節(jié),沒有額外空間

        // |x---|xxxx|xx--| So(unsafe.Sizeof(struct {     i8  int8     i32 int32     i16 int16 }{}), ShouldEqual, 12)  // |x-xx|xxxx| So(unsafe.Sizeof(struct {     i8  int8     i16 int16     i32 int32 }{}), ShouldEqual, 8)

        這兩個結(jié)構(gòu)體里面的內(nèi)容完全一樣,調(diào)整了一下字段順序,節(jié)省了 33% 的空間

        // |x---|xxxx|xx--|----|xxxx|xxxx| So(unsafe.Sizeof(struct {     i8  int8     i32 int32     i16 int16     i64 int64 }{}), ShouldEqual, 24)  // |x-xx|xxxx|xxxx|xxxx| So(unsafe.Sizeof(struct {     i8  int8     i16 int16     i32 int32     i64 int64 }{}), ShouldEqual, 16)

        這里需要注意的是 int64 只能出現(xiàn)在8的倍數(shù)的地址處,因此第一個結(jié)構(gòu)體中,有連續(xù)的4個字節(jié)是空的

        type I8 int8 type I16 int16 type I32 int32  So(unsafe.Sizeof(struct {     i8  I8     i16 I16     i32 I32 }{}), ShouldEqual, 8)

        給類型重命名之后,類型的大小并沒有發(fā)生改變

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
        主站蜘蛛池模板: 蜜国产精品jk白丝AV网站| 1024国产欧美日韩精品| 国产精品女同一区二区| 国精品产露脸自拍| 国产精品爽黄69天堂a| 亚洲日韩一页精品发布| 国产精品户外野外| 国内精品在线视频| 久久国产精品成人片免费| 久久夜色精品国产| 国产精品欧美久久久久无广告 | 麻豆国产精品VA在线观看不卡| CAOPORM国产精品视频免费| 亚洲精品视频免费观看| 精品国产三级a乌鸦在线观看| 在线电影国产精品| 久久久久夜夜夜精品国产| 2021国产精品视频| 精品久久无码中文字幕| 99久久人妻无码精品系列蜜桃| 亚洲欧美激情精品一区二区| 国自产精品手机在线观看视 | 久久人人超碰精品CAOPOREN| 国产精品 码ls字幕影视| 久久精品国产99国产电影网| 欧美日韩人妻精品一区二区在线 | 成人精品一区二区久久久| 中文字幕精品亚洲无线码一区| 国产精品永久免费视频| 北岛玲日韩精品一区二区三区| 2024国产精品极品色在线| 亚洲精品国产成人专区| 亚洲一二成人精品区| 777久久精品一区二区三区无码| 亚洲国语精品自产拍在线观看| 久久国产亚洲精品麻豆| 狠狠色丁香婷婷综合精品视频| 欧美精品/日韩精品/国产精品 | 久久精品国产亚洲AV无码娇色 | 国产精品网址在线观看你懂的| 99九九精品免费视频观看|