• Home
  • History
  • Annotate
Name Date Size #Lines LOC

..09-Mar-2021-

README.mdH A D09-Mar-20212.8 KiB126111

main.goH A D09-Mar-20212.8 KiB152131

README.md

1# structlayout
2
3The _structlayout_ utility prints the layout of a struct – that is the
4byte offset and size of each field, respecting alignment/padding.
5
6The information is printed in human-readable form by default, but can
7be emitted as JSON with the `-json` flag. This makes it easy to
8consume this information in other tools.
9
10A utility called _structlayout-pretty_ takes this JSON and prints an
11ASCII graphic representing the memory layout.
12
13_structlayout-optimize_ is another tool. Inspired by
14[maligned](https://github.com/mdempsky/maligned), it reads
15_structlayout_ JSON on stdin and reorders fields to minimize the
16amount of padding. The tool can itself emit JSON and feed into e.g.
17_structlayout-pretty_.
18
19_structlayout-svg_ is a third-party tool that, similarly to
20_structlayout-pretty_, visualises struct layouts. It does so by
21generating a fancy-looking SVG graphic. You can install it via
22
23```
24go get github.com/ajstarks/svgo/structlayout-svg
25```
26
27## Installation
28
29See [the main README](https://github.com/dominikh/go-tools#installation) for installation instructions.
30
31## Examples
32
33```
34$ structlayout bufio Reader
35Reader.buf []byte: 0-24 (24 bytes)
36Reader.rd io.Reader: 24-40 (16 bytes)
37Reader.r int: 40-48 (8 bytes)
38Reader.w int: 48-56 (8 bytes)
39Reader.err error: 56-72 (16 bytes)
40Reader.lastByte int: 72-80 (8 bytes)
41Reader.lastRuneSize int: 80-88 (8 bytes)
42```
43
44```
45$ structlayout -json bufio Reader | jq .
46[
47  {
48    "name": "Reader.buf",
49    "type": "[]byte",
50    "start": 0,
51    "end": 24,
52    "size": 24,
53    "is_padding": false
54  },
55  {
56    "name": "Reader.rd",
57    "type": "io.Reader",
58    "start": 24,
59    "end": 40,
60    "size": 16,
61    "is_padding": false
62  },
63  {
64    "name": "Reader.r",
65    "type": "int",
66    "start": 40,
67    "end": 48,
68    "size": 8,
69    "is_padding": false
70  },
71...
72```
73
74```
75$ structlayout -json bufio Reader | structlayout-pretty
76    +--------+
77  0 |        | <- Reader.buf []byte
78    +--------+
79    -........-
80    +--------+
81 23 |        |
82    +--------+
83 24 |        | <- Reader.rd io.Reader
84    +--------+
85    -........-
86    +--------+
87 39 |        |
88    +--------+
89 40 |        | <- Reader.r int
90    +--------+
91    -........-
92    +--------+
93 47 |        |
94    +--------+
95 48 |        | <- Reader.w int
96    +--------+
97    -........-
98    +--------+
99 55 |        |
100    +--------+
101 56 |        | <- Reader.err error
102    +--------+
103    -........-
104    +--------+
105 71 |        |
106    +--------+
107 72 |        | <- Reader.lastByte int
108    +--------+
109    -........-
110    +--------+
111 79 |        |
112    +--------+
113 80 |        | <- Reader.lastRuneSize int
114    +--------+
115    -........-
116    +--------+
117 87 |        |
118    +--------+
119```
120
121```
122$ structlayout -json bytes Buffer | structlayout-svg -t "bytes.Buffer" > /tmp/struct.svg
123```
124
125![memory layout of bytes.Buffer](/images/screenshots/struct.png)
126