いろいろ備忘録日記

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

Goメモ-405 (構造体のパディングを可視化)(go-tools/cmd/structlayout)

関連記事

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

概要

以下、自分用のメモです。忘れないうちにメモメモ。。

構造体を定義する際に、うまくアライメントをあわせないとパディングが生じます。

いつも頭で計算してやっていたのですが、以下のようなツールがあることをしりました。

github.com

staticcheckの人がつくっていたんですね。

使ってみたところ、とても便利だったので忘れないようここにメモメモ。。。

サンプル

以下のようなソースを用意。

package main

type A struct {
    V1 uint
    V2 bool
    V3 bool
    V4 int
    V5 int32
    V6 int16
    V7 byte
}

func main() {
}

見たらすぐパディング入るやんって構造してますがw

んで、以下のツールをインストールします。

$ go install honnef.co/go/tools/cmd/structlayout@latest
$ go install honnef.co/go/tools/cmd/structlayout-pretty@latest
$ go install github.com/ajstarks/svgo/structlayout-svg@latest

一番デフォルトな使い方は以下。パッケージ、構造体名と指定します。

$ structlayout app A
A.V1 uint: 0-8 (size 8, align 8)
A.V2 bool: 8-9 (size 1, align 1)
A.V3 bool: 9-10 (size 1, align 1)
padding: 10-16 (size 6, align 0)
A.V4 int: 16-24 (size 8, align 8)
A.V5 int32: 24-28 (size 4, align 4)
A.V6 int16: 28-30 (size 2, align 2)
A.V7 byte: 30-31 (size 1, align 1)
padding: 31-32 (size 1, align 0)

これでも分かるのですが、以下のようにすると、もう少し見やすく表示してくれます。

$  structlayout -json app A | structlayout-pretty
    +--------+
  0 |        | <- A.V1 uint (size 8, align 8)
    +--------+
    -........-
    +--------+
  7 |        |
    +--------+
  8 |        | <- A.V2 bool (size 1, align 1)
    +--------+
  9 |        | <- A.V3 bool (size 1, align 1)
    +--------+
 10 |        | <- padding (size 6, align 0)
    +--------+
    -........-
    +--------+
 15 |        |
    +--------+
 16 |        | <- A.V4 int (size 8, align 8)
    +--------+
    -........-
    +--------+
 23 |        |
    +--------+
 24 |        | <- A.V5 int32 (size 4, align 4)
    +--------+
    -........-
    +--------+
 27 |        |
    +--------+
 28 |        | <- A.V6 int16 (size 2, align 2)
    +--------+
 30 |        | <- A.V7 byte (size 1, align 1)
    +--------+
 31 |        | <- padding (size 1, align 0)
    +--------+

すごく見やすい。また、以下のようにすると svg で出力してくれます。

$ structlayout -json app A | structlayout-svg -t "app.A" > struct.svg

こんな感じ。

素晴らしい。ツール作成してくださった方に感謝です。

参考情報

Goのおすすめ書籍


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

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