หันคำถามของคุณไปรอบ ๆ คำถามสร้างแรงบันดาลใจที่แท้จริงอยู่ภายใต้สถานการณ์ใดที่เราสามารถหลีกเลี่ยงค่าใช้จ่ายในการเก็บขยะได้?
ดีปิดแรกสิ่งที่มีค่าใช้จ่ายในการเก็บขยะหรือไม่ มีสองค่าใช้จ่ายหลัก ครั้งแรกที่คุณจะต้องตรวจสอบสิ่งที่มีชีวิตอยู่ ; ที่ต้องใช้งานเป็นจำนวนมาก ประการที่สองคุณต้องกระชับรูที่เกิดขึ้นเมื่อคุณปล่อยสิ่งที่จัดสรรระหว่างสองสิ่งที่ยังมีชีวิตอยู่ หลุมเหล่านั้นสิ้นเปลือง แต่การบีบอัดมันมีราคาแพงเช่นกัน
เราจะหลีกเลี่ยงค่าใช้จ่ายเหล่านี้ได้อย่างไร
เห็นได้ชัดว่าถ้าคุณสามารถหารูปแบบการใช้พื้นที่เก็บข้อมูลที่คุณไม่เคยจัดสรรบางสิ่งบางอย่างมานานแล้วจัดสรรบางสิ่งในระยะสั้นแล้วจัดสรรบางสิ่งที่ยาวนานคุณสามารถลดค่าใช้จ่ายของหลุม หากคุณสามารถรับประกันได้ว่าสำหรับชุดย่อยบางส่วนของพื้นที่เก็บข้อมูลของคุณทุกการจัดสรรครั้งต่อไปจะสั้นกว่าชุดก่อนหน้านี้ในพื้นที่จัดเก็บนั้นจะไม่มีช่องโหว่ใด ๆ ในที่เก็บข้อมูลนั้น
แต่ถ้าเราได้แก้ปัญหาหลุมจากนั้นเราได้แก้ปัญหาการเก็บขยะมากเกินไป คุณมีบางอย่างในที่เก็บที่ยังมีชีวิตอยู่หรือไม่? ใช่. ทุกสิ่งได้รับการจัดสรรก่อนที่จะมีอายุอีกต่อไปหรือไม่? ใช่ - สมมติฐานนี้เป็นวิธีกำจัดความเป็นไปได้ของหลุม ดังนั้นสิ่งที่คุณต้องทำคือพูดว่า "การจัดสรรครั้งล่าสุดยังมีชีวิตอยู่หรือไม่" และคุณรู้ว่าทุกสิ่งมีชีวิตในที่เก็บข้อมูลนั้น
เรามีชุดการจัดสรรพื้นที่เก็บข้อมูลที่เรารู้หรือไม่ว่าการจัดสรรครั้งต่อ ๆ ไปนั้นมีอายุสั้นกว่าการจัดสรรครั้งก่อน ใช่ กรอบการเปิดใช้งานของวิธีการจะถูกทำลายในลำดับที่ตรงกันข้ามที่พวกเขาสร้างขึ้นเพราะพวกเขามักมีอายุสั้นกว่าการเปิดใช้งานที่สร้างขึ้น
ดังนั้นเราสามารถเก็บเฟรมการเปิดใช้งานบนสแต็กและรู้ว่าไม่จำเป็นต้องรวบรวม หากมีเฟรมใด ๆ บนสแต็กทั้งชุดของเฟรมด้านล่างมีอายุการใช้งานนานขึ้นดังนั้นจึงไม่จำเป็นต้องรวบรวม และพวกเขาจะถูกทำลายในลำดับตรงกันข้ามกับที่พวกเขาถูกสร้างขึ้น ค่าใช้จ่ายในการรวบรวมขยะจึงลดลงสำหรับเฟรมการเปิดใช้งาน
นั่นเป็นสาเหตุที่เรามีพูลชั่วคราวในสแต็กตั้งแต่แรก: เพราะมันเป็นวิธีที่ง่ายในการใช้วิธีการเปิดใช้งานโดยไม่ทำให้เกิดการจัดการหน่วยความจำผิด
(แน่นอนว่ายังมีค่าใช้จ่ายในการเก็บขยะที่หน่วยความจำอ้างอิงโดยอ้างอิงในเฟรมการเปิดใช้งานยังคงอยู่ที่นั่น)
ตอนนี้ให้พิจารณาระบบโฟลว์ควบคุมที่เฟรมการเปิดใช้งานไม่ถูกทำลายตามลำดับที่คาดการณ์ได้ จะเกิดอะไรขึ้นหากการเปิดใช้งานระยะสั้นสามารถเปิดใช้งานการเปิดใช้งานระยะยาวได้ ดังที่คุณอาจจินตนาการได้ในโลกนี้คุณไม่สามารถใช้สแต็กอีกต่อไปเพื่อปรับความจำเป็นในการรวบรวมการเปิดใช้งาน ชุดการเปิดใช้งานอาจมีรูอีกครั้ง
C # 2.0 yield return
มีคุณลักษณะนี้ในรูปแบบของ วิธีการที่ให้ผลตอบแทนเป็นไปได้ที่จะเปิดใช้งานในภายหลัง - ครั้งต่อไปที่เรียกว่า MoveNext - และเมื่อสิ่งที่เกิดขึ้นไม่สามารถคาดการณ์ได้ ดังนั้นข้อมูลที่ตามปกติจะอยู่ในสแต็กสำหรับกรอบการเปิดใช้งานของบล็อกตัววนซ้ำจะถูกเก็บไว้ในกองแทนที่จะเป็นที่เก็บขยะเมื่อมีการรวบรวมตัวแจงนับ
ในทำนองเดียวกันคุณสมบัติ "async / await" ที่มาในรุ่นถัดไปของ C # และ VB จะช่วยให้คุณสร้างวิธีที่การเปิดใช้งาน "ผลตอบแทน" และ "ดำเนินต่อ" ที่จุดที่กำหนดไว้อย่างดีในระหว่างการดำเนินการของวิธีการ เนื่องจากเฟรมการเปิดใช้งานจะไม่ถูกสร้างและทำลายในลักษณะที่คาดการณ์ได้อีกต่อไปข้อมูลทั้งหมดที่เคยถูกเก็บไว้ในสแต็กจะต้องถูกเก็บไว้ในกอง
มันเป็นเพียงอุบัติเหตุจากประวัติศาสตร์ที่เราเกิดขึ้นในการตัดสินใจสำหรับสองสามทศวรรษที่ภาษาที่มีเฟรมการเปิดใช้งานที่สร้างและทำลายในลักษณะที่สั่งอย่างเคร่งครัดเป็นแฟชั่น เนื่องจากภาษาสมัยใหม่ขาดคุณสมบัตินี้มากขึ้นคาดว่าจะเห็นภาษามากขึ้นเรื่อย ๆ ที่รวมการใช้งานต่อเนื่องไปยังฮีปที่เก็บรวบรวมขยะมากกว่ากองซ้อน