unsafe.Pointer 与内存对齐:绕过类型系统实现零拷贝操作
深入 unsafe 包和内存对齐规则,学习如何安全地操作底层内存布局,实现高效的结构体序列化和字段访问。 · 难度:入门 · +10XP
unsafe.Pointer 与内存对齐
Go 的 unsafe.Pointer 允许任意类型转换,但必须遵循内存对齐规则,否则会导致未定义行为。本教程详细讲解结构体字段的对齐方式、padding 计算,并演示如何使用 unsafe.Alignof 和 unsafe.Offsetof 安全地读写内存。通过一个零拷贝序列化器的实现,展示如何在性能敏感场景中安全运用这些技术。
package main
import (
"fmt"
"unsafe"
)
type Example struct {
A bool // 1 byte
B int32 // 4 bytes, 偏移量对齐到4
C int64 // 8 bytes, 偏移量对齐到8
}
func main() {
e := Example{A: true, B: 42, C: 99}
fmt.Println("Size:", unsafe.Sizeof(e))
fmt.Println("Alignof:", unsafe.Alignof(e))
p := unsafe.Pointer(&e)
// 安全访问 B 字段
bPtr := (*int32)(unsafe.Pointer(uintptr(p) + unsafe.Offsetof(e.B)))
fmt.Println("B value:", *bPtr)
}