程式語言在記憶體中分配物件,不同的語言使用不同的策略來做到這一點。在 C 中,堆疊分配的變數駐留在堆疊上,而堆疊分配的記憶體是動態分配的。另一方面,Python 在堆上分配所有對象,使用引用來存取它們。
Go 的記憶體分配方法不同於 C 和 Python。雖然 Go 沒有明確指定物件的分配位置,但它使用垃圾收集來回收未使用的記憶體。這就提出了關於結構體(複合型類型)在 Go 中如何分配的問題。
考慮以下兩個函數,它們似乎執行相同的任務:
func myFunction() (*MyStructType, error) { var chunk *MyStructType = new(HeaderChunk) ... return chunk, nil } func myFunction() (*MyStructType, error) { var chunk MyStructType ... return &chunk, nil }
這些範例函數提出了幾個問題問題:
在 Go 中,堆疊用於儲存函數參數、局部變數和傳回值。堆疊用於指派使用 new 建立的物件或已逃逸堆疊的物件。
在第一個函數中,使用 new 在堆疊上指派 chunk。在第二個函數中,Go 的逃逸分析確定 &chunk 逃逸了堆疊,因此它也被分配在堆疊上。
儘管 chunk 分配在堆疊上第二個函數,Go 的垃圾收集器確保它在函數返回後仍然可訪問。這是因為逃脫分析確定 chunk 逃脫了函數作用域,只要它被另一個物件引用,垃圾收集器就不會回收它。
結構體傳遞在 Go 中按值排序,因為它們是複合類型。相反,傳遞指標將允許被呼叫者修改原始結構。對於第二個函數,區塊是在堆上分配的,因此不需要向它傳遞指標。但是,當呼叫者需要存取已在堆上分配的結構時,將使用指標。
以上是Go 如何處理結構體的堆疊分配與堆疊分配,以及垃圾收集發揮什麼作用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!