関連記事
GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ
概要
以下、自分用のメモです。忘れないうちにメモメモ。。
構造体を定義する際に、うまくアライメントをあわせないとパディングが生じます。
いつも頭で計算してやっていたのですが、以下のようなツールがあることをしりました。
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のおすすめ書籍
過去の記事については、以下のページからご参照下さい。
サンプルコードは、以下の場所で公開しています。