いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-637 (unsafe.Sizeofで構造体のサイズを取得)

関連記事

GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ

概要

以下、自分用のメモです。

ここ最近、unsafeパッケージについてのメモをちょこちょこしているので、ついでなので unsafe パッケージの他の関数についてもメモ残しておこうと思いました。

他の関数は名前がそのまんまなので、C言語とかやってる人なら大抵予想がつく関数ばかりです。

今回は unsafe.Sizeof について。

サンプル

unsafe_sizeof.go

package unsafes

import (
    "fmt"
    "unsafe"
)

// Sizeof は、 unsafe.Sizeof() についてのサンプルです.
//
// REFERENCES:
//   - https://pkg.go.dev/unsafe@go1.25.3#Sizeof
func Sizeof() error {
    // ---------------------------------------------------------
    // unsafe.Sizeof()
    //
    //   - Cのように 指定した 値の型メモリサイズを算出して返してくれる
    //   - 戻り値は uintptr 型
    //   - あくまでも指定した型から参照できる範囲のメモリサイズのみを返す
    //     - 例えばスライスの場合、 Sizeof が返すのはスライスのヘッダ部分のサイズ
    //     - スライスに実際格納されているデータのメモリサイズは含めてくれない
    // ---------------------------------------------------------
    type mem struct {
        b    bool
        i    int
        i16  int16
        i32  int32
        i64  int64
        s    string
        s2   string
        arr  [3]int
        sli  []int
        sli2 []int
    }

    m := mem{
        b:   true,
        i:   1,
        i16: 2,
        i32: 3,
        i64: 4,
        s:   "",
        s2:  "helloworld",
        arr: [3]int{1, 2, 3},
        sli: []int{},
        sli2: []int{
            1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
        },
    }

    fmt.Println("mem", m)

    fmt.Println("bool", unsafe.Sizeof(m.b))
    fmt.Println("int", unsafe.Sizeof(m.i))
    fmt.Println("int16", unsafe.Sizeof(m.i16))
    fmt.Println("int32", unsafe.Sizeof(m.i32))
    fmt.Println("int64", unsafe.Sizeof(m.i64))
    fmt.Println("string_empty", unsafe.Sizeof(m.s))
    fmt.Println("string_not_empty", unsafe.Sizeof(m.s2))
    fmt.Println("[3]int", unsafe.Sizeof(m.arr))
    fmt.Println("slice_empty", unsafe.Sizeof(m.sli))
    fmt.Println("slice_not_empty", unsafe.Sizeof(m.sli2))

    fmt.Println("----")
    fmt.Println("mem", unsafe.Sizeof(m))

    return nil
}

実行

      $ task
       task: Task "build" is up to date
       task: [run] ./try-golang -onetime

       ENTER EXAMPLE NAME: unsafe_sizeof

       [Name] "unsafe_sizeof"
       mem {true 1 2 3 4  helloworld [1 2 3] [] [1 2 3]}
       bool 1
       int 8
       int16 2
       int32 4
       int64 8
       string_empty 16
       string_not_empty 16
       [3]int 24
       slice_empty 24
       slice_not_empty 24
       ----
       mem 136


       [Elapsed] 76.71µs

参考情報

個人的Goのおすすめ書籍

個人的に読んでとても勉強になった書籍さんたちです。


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。