亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go中的sizeof結構

Go中的sizeof結構

Go
波斯汪 2021-04-08 14:11:26
我正在看Go,它看起來很有前途。我試圖弄清楚如何獲得go結構的大小,例如type Coord3d struct {     X, Y, Z int64  }我當然知道它是24字節,但是我想以編程方式知道它。您對如何執行此操作有任何想法嗎?
查看完整描述

3 回答

?
MMTTMM

TA貢獻1869條經驗 獲得超4個贊

import unsafe "unsafe"


/* Structure describing an inotify event.  */

type INotifyInfo struct {

    Wd     int32  // Watch descriptor

    Mask   uint32 // Watch mask

    Cookie uint32 // Cookie to synchronize two events

    Len    uint32 // Length (including NULs) of name

}


func doSomething() {

    var info INotifyInfo

    const infoSize = unsafe.Sizeof(info)

    ...

}

注意: OP錯誤。unsafe.Sizeof確實在示例Coord3d結構上返回24。

查看完整回答
反對 回復 2021-04-26
?
翻閱古今

TA貢獻1780條經驗 獲得超5個贊

羅杰已經展示了如何從不安全的軟件包中使用SizeOf方法。在依賴于該函數返回的值之前,請確保已閱讀以下內容:


該大小不包括x可能引用的任何內存。例如,如果x是一個切片,則Sizeof返回切片描述符的大小,而不是該切片所引用的內存的大小。


除此之外,我想解釋一下如何使用幾個簡單的規則輕松計算任何結構的大小。然后如何使用有用的服務來驗證您的直覺。


大小取決于其組成的類型以及結構中字段的順序(因為將使用不同的填充)。這意味著具有相同字段的兩個結構可以具有不同的大小。


例如,此結構的大小為32


struct {

    a bool

    b string

    c bool

}

并稍作修改,其大小將為24(由于字段的順序更緊湊,因此相差25%)


struct {

    a bool

    c bool

    b string

}

http://img1.sycdn.imooc.com//60866e2400016fbe03180208.jpghttp://img1.sycdn.imooc.com//60866e2c000134d103150177.jpg

從圖片中可以看到,在第二個示例中,我們刪除了一個填充,并移動了一個字段以利用先前的填充。路線可以是1、2、4或8。填充是用于填充變量以填充路線的空間(基本上是浪費的空間)。

了解此規則并記住以下幾點:

  • bool,int8 / uint8占用1個字節

  • int16,uint16-2個字節

  • int32,uint32,float32-4個字節

  • int64,uint64,float64,指針-8個字節

  • 字符串-16個字節(2個對齊方式為8個字節)

  • 任何條帶占用24個字節(3個對齊8個字節)。因此[]bool,[][][]string都是一樣的(不要忘記重新閱讀我一開始添加的引文)

  • 長度數組n需要n*類型,它需要字節。


有了填充,對齊和字節大小的知識,您可以快速弄清楚如何改善結構(但是使用該服務驗證您的直覺還是有意義)。


查看完整回答
反對 回復 2021-04-26
?
森欄

TA貢獻1810條經驗 獲得超5個贊

binary.TotalSize也是一個選項,但請注意,那和unsafe.Sizeof之間的行為略有不同:binary.TotalSize包括切片內容的大小,而unsafe.Sizeof僅返回頂級描述符的大小。這是一個如何使用TotalSize的示例。


package main


import (

    "encoding/binary"

    "fmt"

    "reflect"

)


type T struct {

    a uint32

    b int8

}


func main() {

    var t T

    r := reflect.ValueOf(t)

    s := binary.TotalSize(r)


    fmt.Println(s)

}


查看完整回答
反對 回復 2021-04-26
  • 3 回答
  • 0 關注
  • 394 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號