2011-01-11 3 views
12

Sự khác nhau giữa các con trỏ được chia sẻ (chẳng hạn như tăng :: shared_ptr hoặc std :: shared_ptr) và phương thức thu gom rác (như được thực hiện trong Java hoặc C#) là gì? Cách tôi hiểu nó, các con trỏ được chia sẻ theo dõi số lần các biến trỏ đến tài nguyên và sẽ tự động hủy tài nguyên khi số đếm đạt đến 0. Tuy nhiên, sự hiểu biết của tôi là bộ thu gom rác cũng quản lý tài nguyên bộ nhớ, nhưng yêu cầu tài nguyên bổ sung để xác định xem một đối tượng vẫn đang được giới thiệu và không nhất thiết phải hủy tài nguyên ngay lập tức.Bộ sưu tập rác so với các con trỏ chia sẻ

Tôi có đúng trong các giả định của mình không và có bất kỳ khác biệt nào khác giữa việc sử dụng bộ thu gom rác và con trỏ được chia sẻ không? Ngoài ra, tại sao bất cứ ai từng sử dụng một bộ thu gom rác trên một con trỏ chia sẻ nếu chúng thực hiện các tác vụ tương tự nhưng với các số hiệu suất khác nhau?

+1

Sử dụng các con trỏ được chia sẻ ** là ** kỹ thuật thu thập rác. Nhiều người thu gom rác thực hiện, ít nhất là bước đầu tiên, tính toán tham chiếu. –

Trả lời

12

Sự khác biệt chính nằm, như bạn đã lưu ý, khi tài nguyên được phát hành/hủy.

Một lợi thế mà GC có thể hữu ích là nếu bạn có tài nguyên mất nhiều thời gian để được phát hành. Đối với một đời chương trình ngắn, nó có thể là tốt đẹp để lại các nguồn lực lủng lẳng và có họ làm sạch lên cuối cùng. Nếu đạt tới giới hạn tài nguyên, thì GC có thể hành động để giải phóng một số trong số chúng. Ngược lại, con trỏ được chia sẻ sẽ giải phóng tài nguyên của chúng ngay sau khi số lượng tham chiếu đạt 0. Điều này có thể tốn kém cho chu kỳ phát hành chuyển đổi thường xuyên của một tài nguyên với các yêu cầu thời gian tốn kém.

Mặt khác, trong một số triển khai thu gom rác, thu gom rác yêu cầu toàn bộ chương trình tạm dừng thực thi trong khi bộ nhớ được kiểm tra, di chuyển xung quanh và giải phóng. Có triển khai thông minh hơn, nhưng không có cách nào hoàn hảo.

+4

Có các bộ thu gom rác tạm thời, gia tăng và đồng thời không yêu cầu bộ đột biến bị gián đoạn bởi bộ thu. Ngoài ra, như tài liệu cho thấy, các bộ thu gom rác thường hoạt động tốt hơn so với đếm tham chiếu trong trình biến đổi điển hình. –

15

Những con trỏ được chia sẻ này (thường được gọi là đếm tham chiếu) chạy theo nguy cơ của chu kỳ.

Bộ sưu tập rác (Đánh dấu và quét) không có vấn đề này.

+0

bạn có thể giải thích những gì bạn có nghĩa là "nguy cơ của chu kỳ"? Bạn có nghĩa là có số tham chiếu "quấn quanh" vì loại dữ liệu được sử dụng để giữ số tham chiếu không? Hay cái gì khác? – helloworld922

+3

Chỉ cần tưởng tượng A giữ một ptr đến B và B trỏ đến A. –

+0

Ah, tôi hiểu. Cảm ơn.Lỗi tràn ngăn xếp quá xấu không cho phép bạn gắn cờ nhiều câu trả lời hay: (Tôi nghĩ cả hai câu trả lời này đều là câu trả lời hay) – helloworld922

0

Trong một hệ thống thu gom rác đơn giản, không ai sẽ giữ một con trỏ trực tiếp đến bất kỳ đối tượng nào; thay vào đó, mã sẽ giữ tham chiếu đến các mục bảng trỏ đến các đối tượng trên heap. Mỗi đối tượng trên heap sẽ lưu trữ kích thước của nó (nghĩa là tất cả các đối tượng heap sẽ tạo thành một danh sách liên kết đơn lẻ) và tham chiếu ngược lại đối tượng trong bảng đối tượng chứa nó (hoặc ít nhất được sử dụng).

Khi bảng heap hoặc bảng đối tượng đầy, hệ thống sẽ đặt cờ "xóa tôi" trên mọi đối tượng trong bảng. Nó sẽ kiểm tra mọi đối tượng mà nó biết và, nếu "cờ xóa" của nó được thiết lập, bỏ đặt nó và thêm tất cả các đối tượng mà nó biết về danh sách các đối tượng cần kiểm tra. Khi đã xong, mọi đối tượng có cờ "xóa tôi" vẫn được đặt có thể bị xóa.

Khi đã xong, hệ thống sẽ bắt đầu ở đầu heap, lấy từng đối tượng được lưu trữ ở đó và xem tham chiếu đối tượng của nó vẫn trỏ đến nó. Nếu vậy, nó sẽ sao chép đối tượng đó vào đầu của heap, hoặc chỉ cần qua cuối của đối tượng được sao chép cuối cùng; nếu không thì đối tượng sẽ bị bỏ qua (và có thể sẽ bị ghi đè khi các đối tượng khác được sao chép).