กลับตัวชี้ไปที่โครงสร้างภายใน


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มันไม่เหมือน
mangusta

คำตอบ:


109

ไปทำการวิเคราะห์ตัวชี้หนี หากตัวชี้หนีสแต็กในเครื่องซึ่งทำในกรณีนี้วัตถุจะถูกจัดสรรบนฮีป หากไม่ได้หลีกเลี่ยงฟังก์ชันโลคัลคอมไพเลอร์มีอิสระที่จะจัดสรรมันบนสแต็ก (แม้ว่าจะไม่มีการรับประกัน แต่ขึ้นอยู่กับว่าการวิเคราะห์การหลีกเลี่ยงตัวชี้สามารถพิสูจน์ได้ว่าตัวชี้ยังคงอยู่ในฟังก์ชันนี้หรือไม่)


13
นี่คือบล็อกโพสต์ (ข้อจำกัดความรับผิดชอบ: ที่ฉันเขียน) ที่พิจารณาการวิเคราะห์การหลบหนีของ Go อย่างใกล้ชิดมากขึ้น: scvalex.net/posts/29
scvalex

@LilyBallard ไม่ได้รับคำตอบของคุณอย่างเต็มที่ คุณหมายความว่าการพิสูจน์ข้อเท็จจริงของการหลบหนีเป็นไปได้เสมอในขณะที่การพิสูจน์ความจริงของการไม่หลบหนีไม่ใช่หรือ
mangusta

18

เอกสาร Golang "ระบุว่าการส่งตัวชี้กลับไปยังตัวแปรโลคัลนั้นถูกต้องตามกฎหมาย" ตามที่อ่านมา

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

ฉันดูเหมือนว่าคอมไพเลอร์เห็นว่าคุณส่งคืนที่อยู่และเพิ่งส่งที่อยู่ให้คุณ นี่เป็นสำนวนทั่วไปใน Go

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.