6 回复
抱歉,unsafe.Pointer 是会被自动追踪
不涉及 uintptr 和 cgo. 是安全的, 那就不需要标注 go:nosplit 了😌
但是从 unsafe.Pointer 取 uint64 就不安全了
只用了结构体指针首地址, 没计算偏移量
在Go语言中,栈的扩容是由Go的运行时(runtime)系统管理的,并且这一机制是内存安全的。
Go语言使用了一种称为“逃逸分析”(Escape Analysis)的技术来在编译时确定变量的生命周期和作用域,从而决定变量是应该分配在栈上还是堆上。对于栈上的变量,当函数被调用时,栈空间会相应地分配;当函数返回时,栈空间会被自动回收。这种机制确保了栈内存的使用是高效的且相对简单的。
当栈空间不足以容纳新的局部变量或现有的局部变量增长时,Go的运行时会触发栈扩容。这个扩容过程是由运行时系统内部管理的,它会自动分配更大的栈空间,并将原有的栈内容迁移到新分配的栈空间中。这一过程中,运行时系统会确保所有对栈内存的访问都是合法的,不会出现越界访问等内存安全问题。
此外,Go的运行时还提供了垃圾回收机制,用于管理堆内存的分配和回收。虽然栈内存的管理与堆内存有所不同,但Go的运行时系统会确保无论是栈内存还是堆内存的使用都是内存安全的。
总的来说,Go语言中的栈扩容是由运行时系统内部管理的,并且这一过程是内存安全的。开发者在使用Go语言时,通常不需要担心栈扩容可能带来的内存安全问题。