Повернути покажчик на локальну структуру


85

Я бачу кілька зразків коду з такими конструкціями:

type point struct {
  x, y int
}

func newPoint() *point {
  return &point{10, 20}
}

У мене фон C ++, і це здається для мене помилкою. Яка семантика такої конструкції? Чи виділяється нова точка в стеку чи купі?


1
Аналогічне питання (відповідь посилання на документацію): stackoverflow.com/questions/12098435 / ...
Denys Séguret

@ DenysSéguret це не схоже
мангуста,

Відповіді:


109

Go виконує аналіз втечі вказівника. Якщо вказівник уникне локального стека, що і робиться в цьому випадку, об’єкт виділяється в купі. Якщо локальна функція не виходить, компілятор може вільно розподілити її у стеці (хоча це не дає жодних гарантій; це залежить від того, чи зможе аналіз екранування покажчика довести, що покажчик залишається локальним для цієї функції).


13
Ось допис у блозі (застереження: який я писав), який трохи детальніше розглядає
scvalex

@LilyBallard не повністю отримав вашу відповідь. Ви маєте на увазі, що довести факт втечі покажчика завжди можливо, тоді як довести факт НЕ втечі - ні?
мангуста,

18

Golang "Документація стверджує, що повернення покажчика на локальну змінну є цілком законним". Як я тут читав

https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/EYUuead0LsY

Мені здається, компілятор бачить, що ви повертаєте адресу, і просто робить її в купі для вас. Це загальна ідіома в Go.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.