ดูเหมือนว่าหนังสือ NET ทุกเล่มจะพูดถึงประเภทค่าเทียบกับประเภทการอ้างอิงและทำให้เป็นจุด (มักจะไม่ถูกต้อง) ซึ่งเป็นที่จัดเก็บแต่ละประเภท - ฮีปหรือสแต็ก โดยปกติจะอยู่ในบทแรก ๆ และนำเสนอเป็นข้อเท็จจริงที่สำคัญบางอย่าง
ฉันเห็นด้วยอย่างสมบูรณ์ ฉันเห็นสิ่งนี้ตลอดเวลา
เหตุใดหนังสือ. NET จึงพูดถึงการจัดสรรหน่วยความจำแบบกองซ้อนกับกองซ้อน?
สาเหตุส่วนหนึ่งเป็นเพราะคนจำนวนมากมาที่ C # (หรือภาษา. NET อื่น ๆ ) จากพื้นหลัง C หรือ C ++ เนื่องจากภาษาเหล่านั้นไม่ได้บังคับใช้กฎของคุณเกี่ยวกับอายุการเก็บข้อมูลคุณจึงจำเป็นต้องรู้กฎเหล่านั้นและใช้โปรแกรมของคุณอย่างระมัดระวังเพื่อติดตาม
ตอนนี้การรู้กฎเหล่านั้นและติดตามพวกมันใน C ไม่ต้องการให้คุณเข้าใจ "ฮีป" และ "สแต็ก" แต่ถ้าคุณเข้าใจว่าโครงสร้างข้อมูลทำงานอย่างไรมันก็มักจะง่ายต่อการเข้าใจและปฏิบัติตามกฎ
เมื่อเขียนหนังสือมือใหม่มันเป็นเรื่องธรรมดาที่ผู้เขียนจะอธิบายแนวคิดในลำดับเดียวกันกับที่พวกเขาเรียนรู้ นั่นไม่จำเป็นต้องเป็นคำสั่งที่สมเหตุสมผลสำหรับผู้ใช้ เมื่อไม่นานมานี้ฉันเป็นบรรณาธิการด้านเทคนิคสำหรับหนังสือผู้เริ่มต้น C # 4 ของ Scott Dorman และหนึ่งในสิ่งที่ฉันชอบก็คือ Scott เลือกเรียงลำดับหัวข้อที่ค่อนข้างสมเหตุสมผลแทนที่จะเริ่มหัวข้อการจัดการหน่วยความจำขั้นสูง
อีกส่วนหนึ่งของเหตุผลคือหน้าบางหน้าในเอกสาร MSDN เน้นย้ำข้อควรพิจารณาในการจัดเก็บ โดยเฉพาะเอกสาร MSDN ที่เก่ากว่าซึ่งยังคงมีอยู่ตั้งแต่วันแรก ๆ เอกสารส่วนใหญ่นั้นมีข้อผิดพลาดเล็กน้อยที่ไม่เคยมีมาก่อนและคุณต้องจำไว้ว่ามันถูกเขียนขึ้นในเวลาใดเวลาหนึ่งในประวัติศาสตร์และสำหรับผู้ชมที่เฉพาะเจาะจง
ทำไม stack vs heap ถึงสำคัญสำหรับนักพัฒนา. NET
ในความคิดของฉันมันไม่ได้ สิ่งที่สำคัญกว่าที่จะเข้าใจก็คือ:
- ความแตกต่างในความหมายของการคัดลอกระหว่างประเภทอ้างอิงและประเภทค่าคืออะไร?
- พารามิเตอร์ "ref int x" ทำงานอย่างไร
- เหตุใดค่าประเภทจึงไม่เปลี่ยนรูป
และอื่น ๆ
คุณจัดสรรสิ่งของและใช้งานได้ใช่ไหม
นั่นคืออุดมคติ
ตอนนี้มีสถานการณ์ที่มันไม่สำคัญ การรวบรวมขยะน่ากลัวและราคาไม่แพง แต่ไม่ฟรี การทำสำเนาโครงสร้างขนาดเล็กรอบ ๆ นั้นมีราคาไม่แพง แต่ไม่ฟรี มีสถานการณ์ด้านประสิทธิภาพที่สมจริงซึ่งคุณต้องสร้างสมดุลระหว่างต้นทุนของแรงกดดันในการรวบรวมกับค่าใช้จ่ายในการทำสำเนามากเกินไป ในกรณีเหล่านั้นจะเป็นประโยชน์อย่างมากหากมีความเข้าใจอย่างถ่องแท้เกี่ยวกับขนาดตำแหน่งที่ตั้งและอายุการใช้งานจริงของหน่วยความจำที่เกี่ยวข้องทั้งหมด
ในทำนองเดียวกันมีสถานการณ์จำลองที่เหมือนจริงซึ่งจำเป็นต้องรู้ว่าอะไรอยู่ในสแต็กและอะไรที่อยู่ในกองและสิ่งที่ตัวเก็บขยะสามารถเคลื่อนที่ไปมาได้ นั่นเป็นสาเหตุที่ C # มีคุณสมบัติเช่น "แก้ไข", "สแต็กออลล์" และอื่น ๆ
แต่นั่นเป็นสถานการณ์ขั้นสูงทั้งหมด โปรแกรมเมอร์ที่เริ่มต้นนั้นไม่จำเป็นต้องกังวลเกี่ยวกับสิ่งนี้เลย