go如何知道一个对象是分配在栈上还是堆上?
在 Go 中,编译器会自动决定一个对象应该分配在栈上还是堆上。一般来说,如果对象的大小小于等于指针大小,则分配在栈上,否则分配在堆上。
具体来说,如果你想知道某个特定的对象是分配在栈上还是堆上,你可以通过使用内置函数 new
和 make
来控制这个对象的内存分配方式。
- 使用
new
函数可以在堆上分配一个新的对象,并返回一个指向这个对象的指针。例如:
// 创建一个新的字符串对象,并将其分配在堆上
str := new(string)
- 使用
make
函数可以创建一个内建类型的实例,例如切片、映射或通道。这些对象通常都分配在堆上,因为它们的大小不固定。例如:
// 创建一个新的切片对象,并将其分配在堆上
slice := make([]int, 10)
请注意,使用 new
和 make
并不是唯一的方法来控制对象的内存分配方式。你也可以通过手动分配内存来实现这个目的,例如:
// 为一个新的字符串对象分配内存
str := (*string)(unsafe.Pointer(new(uintptr)))
但是,这种方
Copyright © 2022-2023, Koudai Team