Về cơ bản, bộ sưu tập rác chỉ có nghĩa là các đối tượng được phân bổ của bạn sẽ tự động được giải phóng tại một số điểm sau khi chúng không thể truy cập được nữa.
Chính xác hơn, chúng được phát hành khi chúng không thể truy cập được vào chương trình, vì các đối tượng được tham chiếu theo vòng tròn sẽ không bao giờ được phát hành theo cách khác.
Con trỏ thông minh chỉ đề cập đến bất kỳ cấu trúc nào hoạt động như một con trỏ bình thường nhưng có một số chức năng bổ sung kèm theo. Chúng bao gồm nhưng không giới hạn ở việc phân bổ, mà còn sao chép khi viết, kiểm tra ràng buộc, ...
Bây giờ, như bạn đã nói, con trỏ thông minh có thể được sử dụng để thực hiện một hình thức thu gom rác.
Nhưng đoàn tàu tư tưởng đi theo con đường sau:
- Bộ sưu tập rác là một thứ tuyệt vời để có, vì nó tiện lợi và tôi phải chăm sóc ít thứ hơn
- Do đó: Tôi muốn thu gom rác bằng ngôn ngữ của mình
- Bây giờ, làm thế nào có thể đưa GC vào ngôn ngữ của tôi?
Tất nhiên, bạn có thể thiết kế nó như thế này từ đầu. C # được thiết kế để trở thành rác được thu thập, vì vậy chỉ cần new
đối tượng của bạn và nó sẽ được phát hành khi các tham chiếu nằm ngoài phạm vi. Làm thế nào điều này được thực hiện là tùy thuộc vào trình biên dịch.
Nhưng trong C ++, không có ý định thu gom rác. Nếu chúng ta phân bổ một số con trỏ int* p = new int;
và nó nằm ngoài phạm vi, p
nó sẽ bị xóa khỏi ngăn xếp, nhưng không ai quan tâm đến bộ nhớ được phân bổ.
Bây giờ điều duy nhất bạn có từ đầu là các hàm hủy xác định . Khi một đối tượng rời khỏi phạm vi mà nó đã được tạo, hàm hủy của nó được gọi. Kết hợp với các mẫu và nạp chồng toán tử, bạn có thể thiết kế một đối tượng trình bao bọc hoạt động giống như một con trỏ, nhưng sử dụng chức năng hủy để dọn sạch các tài nguyên được gắn vào nó (RAII). Bạn gọi đây là một con trỏ thông minh .
Đây là tất cả đặc thù của C ++: Quá tải toán tử, mẫu, hàm hủy, ... Trong tình huống ngôn ngữ cụ thể này, bạn đã phát triển các con trỏ thông minh để cung cấp cho bạn GC mà bạn muốn.
Nhưng nếu bạn thiết kế một ngôn ngữ với GC từ đầu, đây chỉ là một chi tiết triển khai. Bạn chỉ cần nói đối tượng sẽ được dọn sạch và trình biên dịch sẽ làm điều này cho bạn.
Các con trỏ thông minh như trong C ++ có lẽ sẽ không thể có trong các ngôn ngữ như C #, vốn không có sự phá hủy xác định nào cả (C # hoạt động xung quanh điều này bằng cách cung cấp đường cú pháp để gọi một .Dispose()
số đối tượng nhất định). Các tài nguyên không được ước tính cuối cùng sẽ được thu hồi bởi GC, nhưng nó không được xác định khi nào chính xác điều này sẽ xảy ra.
Và điều này, đến lượt nó, có thể cho phép GC thực hiện công việc của mình hiệu quả hơn. Được tích hợp sâu vào ngôn ngữ hơn các con trỏ thông minh, được đặt lên trên ngôn ngữ, .NET GC có thể ví dụ trì hoãn các hoạt động của bộ nhớ và thực hiện chúng trong các khối để làm cho chúng rẻ hơn hoặc thậm chí di chuyển bộ nhớ xung quanh để tăng hiệu quả dựa trên tần suất các đối tượng được truy cập.