站長資訊網
        最全最豐富的資訊網站

        字節對齊在golang中的使用詳解

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

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

        基本數據大小

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

        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個字節,因為計算機是以字節為單位
        • 64為的機器,一個 int 占8個字節
        • string 類型占16個字節,內部包含一個指向數據的指針(8個字節)和一個 int 的長度(8個字節)
        • slice 類型占24個字節,內部包含一個指向數據的指針(8個字節)和一個 int 的長度(8個字節)和一個 int 的容量(8個字節)
        • map 類型占8個字節,是一個指向 map 結構的指針
        • 可以用 struct{} 表示空類型,這個類型不占用任何空間,用這個作為 map 的 value,可以講 map 當做 set 來用

        字節對齊

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

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

        簡單封裝一個 int8 的結構體,和 int8 一樣,僅占1個字節,沒有額外空間

        // |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)

        這兩個結構體里面的內容完全一樣,調整了一下字段順序,節省了 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 只能出現在8的倍數的地址處,因此第一個結構體中,有連續的4個字節是空的

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

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

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 日本免费精品一区二区三区| 亚洲精品国产av成拍色拍| 日本欧美国产精品第一页久久 | 国产精品日本欧美一区二区| 日韩精品人妻av一区二区三区| 欧美精品香蕉在线观看网| 久久久精品人妻一区二区三区蜜桃 | 999在线视频精品免费播放观看| 亚洲精品视频在线观看你懂的| 国产精品午夜国产小视频 | 国产乱码精品一区二区三区四川人| 久久亚洲美女精品国产精品| 亚洲国产小视频精品久久久三级| 国产精品乱伦| 久草欧美精品在线观看| 久久精品a亚洲国产v高清不卡| 国产精品午夜久久| 伊人久久精品线影院| 国产亚洲精品国产| 国产精品免费无遮挡无码永久视频| 亚洲国产精品专区在线观看| 国产乱人伦偷精品视频不卡| 99久久精品免费国产大片| 国内精品久久久久| 国产亚洲一区二区精品| 国产精品毛片无遮挡| 久久久久久亚洲Av无码精品专口| 中文精品99久久国产 | 亚洲精品国产成人99久久| 99久久精品费精品国产一区二区| 国产美女久久精品香蕉69| 精品无码一区二区三区爱欲| 久久精品aⅴ无码中文字字幕不卡 久久精品aⅴ无码中文字字幕重口 | 亚洲国产精品一区二区第四页| 精品久久久久久久久久久久久久久 | 成人午夜精品网站在线观看| 国产AV午夜精品一区二区三区| 精品不卡一区二区| 99久久99久久精品免费看蜜桃| 999久久久无码国产精品 | 奇米精品视频一区二区三区|