Skip to content

Instantly share code, notes, and snippets.

@Pagliacii
Created September 11, 2023 09:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Pagliacii/525977a4e317aafbeaa5a5637b86bd7b to your computer and use it in GitHub Desktop.
Save Pagliacii/525977a4e317aafbeaa5a5637b86bd7b to your computer and use it in GitHub Desktop.
package main
import (
"fmt"
"unsafe"
)
type Example struct {
Field1 int64
Field2 int32
Field3 int16
Field4 byte
}
type BadExample struct {
Field1 byte
Field2 int64
Field3 int16
Field4 int32
}
func padding(offsetField1, offsetField2, sizeField1 uintptr) uintptr {
return offsetField2 - (offsetField1 + sizeField1)
}
func main() {
example := Example{}
fmt.Println("Size of Example struct:", unsafe.Sizeof(example))
fmt.Println("Alignment of Field1:", unsafe.Alignof(example.Field1))
fmt.Println("Alignment of Field2:", unsafe.Alignof(example.Field2))
fmt.Println("Alignment of Field3:", unsafe.Alignof(example.Field3))
fmt.Println("Alignment of Field4:", unsafe.Alignof(example.Field4))
fmt.Println("Offset of Field1:", unsafe.Offsetof(example.Field1))
fmt.Println("Offset of Field2:", unsafe.Offsetof(example.Field2))
fmt.Println("Offset of Field3:", unsafe.Offsetof(example.Field3))
fmt.Println("Offset of Field4:", unsafe.Offsetof(example.Field4))
fmt.Println(
"Padding after Field1:",
padding(
unsafe.Offsetof(example.Field1),
unsafe.Offsetof(example.Field2),
unsafe.Sizeof(example.Field1),
),
)
fmt.Println(
"Padding after Field2:",
padding(
unsafe.Offsetof(example.Field2),
unsafe.Offsetof(example.Field3),
unsafe.Sizeof(example.Field2),
),
)
fmt.Println(
"Padding after Field3:",
padding(
unsafe.Offsetof(example.Field3),
unsafe.Offsetof(example.Field4),
unsafe.Sizeof(example.Field3),
),
)
fmt.Println()
bad := BadExample{}
fmt.Println("Size of BadExample struct:", unsafe.Sizeof(bad))
fmt.Println("Alignment of Field1:", unsafe.Alignof(bad.Field1))
fmt.Println("Alignment of Field2:", unsafe.Alignof(bad.Field2))
fmt.Println("Alignment of Field3:", unsafe.Alignof(bad.Field3))
fmt.Println("Alignment of Field4:", unsafe.Alignof(bad.Field4))
fmt.Println("Offset of Field1:", unsafe.Offsetof(bad.Field1))
fmt.Println("Offset of Field2:", unsafe.Offsetof(bad.Field2))
fmt.Println("Offset of Field3:", unsafe.Offsetof(bad.Field3))
fmt.Println("Offset of Field4:", unsafe.Offsetof(bad.Field4))
fmt.Println(
"Padding after Field1:",
padding(
unsafe.Offsetof(bad.Field1),
unsafe.Offsetof(bad.Field2),
unsafe.Sizeof(bad.Field1),
),
)
fmt.Println(
"Padding after Field2:",
padding(
unsafe.Offsetof(bad.Field2),
unsafe.Offsetof(bad.Field3),
unsafe.Sizeof(bad.Field2),
),
)
fmt.Println(
"Padding after Field3:",
padding(
unsafe.Offsetof(bad.Field3),
unsafe.Offsetof(bad.Field4),
unsafe.Sizeof(bad.Field3),
),
)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment