1
func MaxSmallSize() {
a := make([]int64, 8191)
b := make([]int64, 8192)
_ = a
_ = b
}
然後運行go build -gcflags='-m' . 2>&1
檢查內存分配的細節。其結果是:
./mem.go:10: can inline MaxSmallSize
./mem.go:12: make([]int64, 8192) escapes to heap
./mem.go:11: MaxSmallSize make([]int64, 8191) does not escape
我的問題是,爲什麼a
小對象,b
是大型對象?
make
64KB將會轉移到堆中,並且少於將分配到堆中。 _MaxSmallSize = 32 << 10
是原因嗎?
go env
GOARCH="amd64"
GOBIN=""
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/vagrant/gopath"
GORACE=""
GOROOT="/home/vagrant/go"
GOTOOLDIR="/home/vagrant/go/pkg/tool/linux_amd64"
CC="gcc"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build201775001=/tmp/go-build"
CXX="g++"
CGO_ENABLED="1"
這是依賴於實現的,不同的編譯器可能會以不同的方式執行,不同的體系結構可能會以不同的方式執行,不同的版本可能會以不同的方式處理它。那麼你的問題到底是什麼? – Volker