91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

字節對齊在golang中使用的示例分析

發布時間:2021-09-10 17:07:27 來源:億速云 閱讀:125 作者:柒染 欄目:編程語言

本篇文章為大家展示了字節對齊在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)

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

上述內容就是字節對齊在golang中使用的示例分析,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

蓬莱市| 九台市| 大荔县| 盐边县| 盖州市| 句容市| 章丘市| 邹城市| 聊城市| 灯塔市| 广灵县| 营山县| 乌拉特后旗| 新兴县| 灌阳县| 泽库县| 三门县| 涟源市| 通渭县| 峨边| 东至县| 江口县| 乌什县| 龙南县| 安仁县| 榆中县| 承德县| 临江市| 敖汉旗| 中卫市| 德钦县| 兴仁县| 隆回县| 桐庐县| 崇礼县| 巴楚县| 佛坪县| 邻水| 土默特左旗| 河曲县| 民乐县|