Câu trả lời thực sự là cách duy nhất để tạo ra một cơ chế thu gom rác an toàn, hiệu quả là có sự hỗ trợ ở cấp độ ngôn ngữ cho các tài liệu tham khảo mờ. (Hoặc, ngược lại, thiếu hỗ trợ ở cấp độ ngôn ngữ để thao tác bộ nhớ trực tiếp.)
Java và C # có thể làm điều đó bởi vì chúng có các kiểu tham chiếu đặc biệt không thể thao tác được. Điều này cho phép bộ thực thi tự do thực hiện những việc như di chuyển các đối tượng được phân bổ trong bộ nhớ , điều này rất quan trọng đối với việc thực hiện GC hiệu suất cao.
Đối với hồ sơ, không có triển khai GC hiện đại nào sử dụng tính tham chiếu , do đó hoàn toàn là cá trích đỏ. Các GC hiện đại sử dụng bộ sưu tập thế hệ, trong đó các phân bổ mới được xử lý về cơ bản giống như cách phân bổ ngăn xếp trong một ngôn ngữ như C ++, và sau đó định kỳ mọi đối tượng mới được phân bổ vẫn còn sống được chuyển đến một không gian "sống sót" riêng biệt và toàn bộ một thế hệ của các đối tượng được giải quyết cùng một lúc.
Cách tiếp cận này có những ưu và nhược điểm: nhược điểm là phân bổ heap trong ngôn ngữ hỗ trợ GC nhanh như phân bổ stack trong ngôn ngữ không hỗ trợ GC và nhược điểm là các đối tượng cần thực hiện dọn dẹp trước khi bị phá hủy yêu cầu một cơ chế riêng (ví dụ: using
từ khóa của C # ) hoặc nếu không, mã dọn dẹp của họ chạy không xác định.
Lưu ý rằng một chìa khóa cho một GC hiệu suất cao là phải có hỗ trợ ngôn ngữ cho một lớp tài liệu tham khảo đặc biệt. C không có hỗ trợ ngôn ngữ này và sẽ không bao giờ; bởi vì C ++ có quá tải toán tử, nó có thể mô phỏng loại con trỏ của GC, mặc dù nó sẽ phải được thực hiện cẩn thận. Trên thực tế, khi Microsoft phát minh ra phương ngữ C ++ chạy theo CLR (thời gian chạy .NET), họ đã phải phát minh ra một cú pháp mới cho "tham chiếu kiểu C #" (ví dụ Foo^
) để phân biệt với "tham chiếu kiểu C ++" (ví dụ Foo&
).
Những gì C ++ có, và những gì được lập trình viên C ++ sử dụng thường xuyên, là những con trỏ thông minh , thực sự chỉ là một cơ chế đếm tham chiếu. Tôi sẽ không coi việc tham chiếu là GC "thật", nhưng nó mang lại nhiều lợi ích giống nhau, với chi phí hiệu năng chậm hơn so với quản lý bộ nhớ thủ công hoặc GC thực sự, nhưng với lợi thế là phá hủy xác định.
Vào cuối ngày, câu trả lời thực sự sôi nổi với một tính năng thiết kế ngôn ngữ. C đã đưa ra một lựa chọn, C ++ đã đưa ra một lựa chọn cho phép nó tương thích ngược với C trong khi vẫn cung cấp các lựa chọn thay thế đủ tốt cho hầu hết các mục đích và Java và C # đã đưa ra một lựa chọn khác không tương thích với C nhưng cũng đủ tốt cho hầu hết các mục đích. Thật không may, không có viên đạn bạc, nhưng làm quen với các lựa chọn khác nhau ngoài kia sẽ giúp bạn chọn đúng cho bất kỳ chương trình nào bạn đang cố gắng xây dựng.