คำตอบที่แท้จริงคือวิธีเดียวที่จะทำให้กลไกการรวบรวมขยะที่ปลอดภัยและมีประสิทธิภาพคือการสนับสนุนระดับภาษาสำหรับการอ้างอิงทึบแสง (หรือตรงกันข้ามขาดการสนับสนุนระดับภาษาสำหรับการจัดการหน่วยความจำโดยตรง)
Java และ C # สามารถทำได้เนื่องจากมีประเภทการอ้างอิงพิเศษที่ไม่สามารถจัดการได้ สิ่งนี้ให้อิสระในการทำสิ่งต่าง ๆ เช่นการย้ายวัตถุที่ถูกจัดสรรในหน่วยความจำซึ่งมีความสำคัญต่อการใช้งาน GC ที่มีประสิทธิภาพสูง
สำหรับเร็กคอร์ดไม่มีการใช้งาน GC ที่ทันสมัยใช้การนับการอ้างอิงเพื่อให้เป็นปลาเฮอริ่งแดงอย่างสมบูรณ์ GCs สมัยใหม่ใช้คอลเลคชั่น generational ซึ่งการจัดสรรใหม่จะได้รับการปฏิบัติเป็นหลักเช่นเดียวกับการจัดสรรสแต็คในภาษาเช่น C ++ และจากนั้นวัตถุที่ได้รับการจัดสรรใหม่เป็นระยะ ๆ จะถูกย้ายไปยังพื้นที่ "ผู้รอดชีวิต" แยกต่างหาก ของวัตถุถูกยกเลิกการจัดสรรในครั้งเดียว
วิธีนี้มีข้อดีข้อเสีย: ข้อเสียคือการจัดสรรฮีปในภาษาที่สนับสนุน GC นั้นเร็วพอ ๆ กับการจัดสรรสแต็กในภาษาที่ไม่รองรับ GC และข้อเสียคือวัตถุที่ต้องล้างข้อมูลก่อนที่จะถูกทำลาย ต้องการกลไกแยกต่างหาก (เช่นusing
คีย์เวิร์ดของ C # ) มิฉะนั้นโค้ดการล้างข้อมูลของมันจะทำงานแบบไม่กำหนดค่า
โปรดทราบว่าหนึ่งกุญแจสำหรับ GC ประสิทธิภาพสูงคือต้องมีการสนับสนุนภาษาสำหรับการอ้างอิงระดับพิเศษ C ไม่มีการสนับสนุนภาษานี้และจะไม่; เนื่องจาก C ++ มีตัวดำเนินการมากไปมันอาจเลียนแบบตัวชี้ GC'd ได้แม้ว่ามันจะต้องทำอย่างระมัดระวัง ในความเป็นจริงเมื่อ Microsoft คิดค้นภาษา C ++ ที่จะทำงานภายใต้ CLR (รันไทม์. NET) พวกเขาจะต้องสร้างไวยากรณ์ใหม่สำหรับ "C # -style reference" (เช่นFoo^
) เพื่อแยกพวกเขาออกจาก "C ++ - การอ้างอิงลักษณะ" (เช่นFoo&
)
สิ่งที่ C ++ มีและสิ่งที่โปรแกรม C ++ ใช้เป็นประจำคือพอยน์เตอร์อัจฉริยะซึ่งเป็นเพียงกลไกการนับการอ้างอิง ฉันจะไม่พิจารณาการนับการอ้างอิงว่าเป็น "จริง" GC แต่มันให้ประโยชน์มากมายเหมือนกันในราคาที่ประสิทธิภาพช้ากว่าการจัดการหน่วยความจำด้วยตนเองหรือ GC จริง แต่ก็มีข้อดีของการทำลายล้างที่กำหนดขึ้น
ในตอนท้ายของวันคำตอบจะลดลงอย่างมากต่อคุณสมบัติการออกแบบภาษา C เลือกหนึ่งตัวเลือก C ++ ทำทางเลือกที่ทำให้สามารถย้อนกลับเข้ากันได้กับ C ในขณะที่ยังคงให้ทางเลือกที่ดีพอสำหรับวัตถุประสงค์ส่วนใหญ่และ Java และ C # ทำตัวเลือกต่าง ๆ ที่เข้ากันไม่ได้กับ C แต่ก็ดีพอสำหรับ วัตถุประสงค์ส่วนใหญ่ น่าเสียดายที่ไม่มี bullet เงิน แต่การคุ้นเคยกับตัวเลือกที่แตกต่างกันออกไปจะช่วยให้คุณเลือกรายการที่ถูกต้องสำหรับโปรแกรมใดก็ตามที่คุณกำลังพยายามสร้าง