golang的記憶體模型與new 與make

2022-09-17 11:54:13 字數 1280 閱讀 1486

要徹底理解new()與make()的區別, 最好從記憶體模型入手. golang屬於c family, 而c程式在unix的內在模型:

|低位址|text|data|bss|heap-->|unused|<--stack|env|高位址|

其中:(1)text儲存程式主體,即機器指令.

(2)data,bss儲存全域性變數, data儲存初始化的全域性變數. bss儲存未初始化的全域性變數. bss全稱block start by symbol, 以符號開始的塊.

(3)heap: 動態記憶體堆

(4)stack: 函式呼叫棧.

(5)env: 程式執行環境變數.

value types: variable point direct to value, 即變數在函式呼叫棧中的內容就是value.

reference types: variable point to reference toward heap, 即變數在函式呼叫棧中的內容是reference, 指向heap中的某塊記憶體.

賦值操作=或:=, 都是將某個variable在函式呼叫中棧中的內容複製給目標變數. 對於value types是複製值. 對於reference types是複製引用.

new()操作: 在函式呼叫棧中分配記憶體, 內容是目標型別的零值, 返回值是目標型別的指標.

make()操作: 先在動態記憶體堆分配記憶體, 內容也是目標型別的零值, 再在函式呼叫棧中分配記憶體, 內容是分配的堆位址, 返回值是目標型別的值.

注意: 一般來說,

new()用於value types

make()用於reference types.

但是, new()也可用於refrences types, 只是返回值是nil的指標. make()不可用於value types, 編譯會出錯: make(***) cannot  make type ***

對於非elementary(primitive) type,即非基本型別, new()等價於&type{}, 但對於基本型別, 不支援&p{}語法, 就必須使用new()來建立指標. 

對於初始化空值, make(type)行人於type{}, 但要初始化多值, 就必須使用make(type, m)

以上原則更多體現在長變數宣告long variable declaration, 與短變數宣告short variable declaration. 對於後者, 更常使用new()與make()初始化.

由於reference types的特點, 容易造成某些陷阱, 例如: 多個reference指向heap中的大記憶體,導致不能及時釋放造成記憶體洩露危險.

Golang的make與new的區別

make用於內建型別 map slice 和channel 的記憶體分配。new用於各種型別的記憶體分配。new的函式宣告 func new type type接受乙個引數,這個引數是乙個型別,分配好記憶體後,返回乙個指向該型別記憶體位址的指標。它同時把分配的記憶體置為零,也就是型別的零值。make...

程式的記憶體模型 new運算子

知識點1 c 中利用new操作符在堆區開闢資料 知識點2 堆區開闢的資料,由程式設計師手動開闢,手動釋放,釋放利用delete 知識點3 語法 new 資料型別 如下圖所示 所示,利用new建立的資料,會返回該資料對應的型別的指標 int func intmain 用法示例 int pi newin...

golang 指標與記憶體

go指標 1.go指標提供了控制資料結構的指標的能力,但不能進行指標運算,go語言允許控制特定集合的資料結構,分配的數量以及記憶體訪問模式。2.預設值 nil,沒有 null 常量 3.不支援指標運算,不 支援 運算子,直接 用 訪問目標成員 4.go語言的取位址符是 放入乙個變數前使用就會返回相應...