make、new内存分配是在堆上还是在栈上?
时间: 2023-12-27 10:04:51 浏览: 154
make和new都是在堆上分配内存。在Golang中,make主要用于切片、映射和通道的初始化,而new用于分配任何类型的内存并返回指向其类型的指针。无论是make还是new,它们都是在堆上分配内存,因为堆是动态分配内存的地方,可以在程序运行时动态地分配和释放内存,而栈是静态分配内存的地方,内存分配和释放是由编译器自动完成的。
相关问题
golang make分配内存
在Go语言中,`make` 函数主要用于为内置类型(如切片、映射和通道)分配内存和初始化它们。和 C 或其他语言中的直接内存分配方式不同,`make` 分配的内存会进行初始化,使得内置类型的零值更加有意义。下面是 `make` 在不同类型上使用的一些细节:
1. 切片:使用 `make` 创建切片时,可以指定切片的长度和容量。如果只提供了长度,那么容量也会被设置为和长度相同。
```go
s := make([]int, 10) // 长度为10,容量也是10
s := make([]int, 10, 15) // 长度为10,容量为15
```
2. 映射:使用 `make` 创建映射时,可以为映射分配初始容量,但这不是必须的。即使不指定容量,映射也可以动态地增长。
```go
m := make(map[string]int) // 创建一个空映射
m := make(map[string]int, 10) // 创建一个预分配空间的空映射
```
3. 通道:使用 `make` 创建通道时,可以指定通道的缓冲大小。如果缓冲大小为零,则创建的是无缓冲通道。
```go
ch := make(chan int) // 创建一个无缓冲的通道
ch := make(chan int, 10) // 创建一个缓冲大小为10的通道
```
使用 `make` 函数分配的内存可以通过 `delete` 或者 `close` 函数进行资源释放,例如,关闭通道、清空映射等。
golang new分配内存
Go语言中的`new`是一个内建函数,它用于分配内存。这个函数接受一个类型作为参数,并返回一个指向该类型零值的指针。换句话说,`new`函数初始化了一个指定类型的变量,并为该变量分配了内存,但不会初始化变量的值。
使用`new`分配内存的步骤如下:
1. 调用`new`函数时,Go语言运行时会为指定类型的实例分配一片新的内存空间。
2. 初始化这块内存,使得所有字段都设置为类型的零值(对于数值类型来说是0,布尔类型是false,指针和引用类型是nil等)。
3. 返回一个指向这块内存的指针,即该类型的指针。
举个例子,如果你使用`new(T)`,其中`T`是一个Go中的类型,你会得到一个指向新分配的`T`类型零值的指针。
```
p := new(int) // p 是一个指向 int 类型零值的指针
fmt.Println(*p) // 输出 0,因为它是一个零值
```
在Go中,`new`的使用非常简单,但重要的是理解它与`make`的区别。`make`只能用于创建切片、映射和通道,并且它返回的是一个类型实例而非指针,同时该类型的实例已经被初始化。