Created
September 11, 2023 09:14
-
-
Save Pagliacii/525977a4e317aafbeaa5a5637b86bd7b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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