Я уже знал, что runtime.morestack
вызовет переключение контекста goroutine (если sysmon goroutine пометил, что он должен переключаться).
И когда я провожу некоторый эксперимент по этому поводу, я 'Мы нашли интересный факт.
Сравните следующие коды.
func main() {
_ = make([]int, 13)
}
func main() {
_ = make([]int, 14)
}
И скомпилируйте их, выполнив следующую команду: (Попробовал в go1.9 и перейти 1.11)
$ go build -gcflags "-S -l -N" x.go
Вы можете обнаружить существенную разницу в том, что первый выход содержит CALL runtime.morestack_noctxt(SB)
, а второй - нет.
Я полагаю, что это оптимизация, но почему?