當我創建一個新的切片或結構用一個品牌或新的呼叫:Go如何在make或new calls中分配內存?
s := make([]int64, 10, 100)
o := new(MyStruct)
多少內存去同一個內存分配系統調用分配?是否預先分配內存,以便後續調用不會觸發新的系統調用?
我在問這個,因爲我需要經常在我的代碼中分配內存。我不確定是否需要自己實現內存分配器,或者如果我可以依靠Go來執行骯髒的工作。如果Go預分配內存,我可以自定義分配的塊大小嗎?
我寫圍棋一些實驗代碼,並運行在strace的代碼,但我不明白圍棋確實與mmap系統調用:
mmap(0xc000000000, 65536, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xc000000000
munmap(0xc000000000, 65536) = 0
mmap(NULL, 262144, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7efdd1017000
mmap(0xc208000000, 1048576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xc208000000
mmap(0xc207ff0000, 65536, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xc207ff0000
mmap(0xc000000000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xc000000000
mmap(NULL, 65536, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7efdd1007000
mmap(NULL, 1439992, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7efdd0ea7000
你可以依靠去做骯髒的工作。它呼籲系統獲取更多的東西,而不僅僅是爲小的「make」/「new」調用分配的內容。如果你想了解詳情,https://github.com/golang/go/blob/master/src/runtime/mem_linux.go可能是一個起點。但通常情況下,我認爲你想要擴大你的產品,然後讓簡介告訴你什麼是緩慢的。 – twotwotwo
快速提問:是否在保留內存中分配不同大小的插槽以避免碎片?也許我需要閱讀的源代碼... – NeoWang
https://github.com/golang/go/blob/master/src/runtime/malloc.go – kostya