2011-02-08 29 views

Trả lời

10

Một mảng yếu là một mảng con trỏ yếu. Một con trỏ yếu là một tham chiếu về một giá trị có thể được thu thập rác.

Nếu bạn sử dụng một con trỏ thông thường trên một giá trị, bạn sẽ ngăn chặn việc thu gom rác của nó cho đến khi trọng tài chính là rác được thu thập. Với một tham chiếu yếu giá trị có thể được thu thập trước khi trọng tài.

Ví dụ về sử dụng là nguồn cung cấp dữ liệu cho nhiều bồn rửa. Nếu nguồn giữ các con trỏ thường xuyên đến các bồn rửa, bất cứ khi nào một bồn rửa không còn cần thiết thì nó sẽ không được thu gom rác cho đến khi nguồn (ví dụ như có thể không bao giờ xảy ra). Nếu nguồn sử dụng các tham chiếu yếu đến các bồn rửa, thì các bồn rửa có thể là rác được thu gom trước nguồn.

Ví dụ khác là hashconsing cho một loại sử dụng hashtables yếu (có liên quan đến mảng yếu). Nhanh chóng, hashconsing là một cách để ghi nhớ tất cả các giá trị của một kiểu đã cho được tạo và sống trong chương trình. Cùng với một hàm tạo giá trị thích hợp, điều này có thể đảm bảo chia sẻ tối đa các giá trị của loại đó và cho phép thực hiện bình đẳng cấu trúc trên loại đó như là bình đẳng vật lý. Trong trường hợp đó nếu một hashtable không yếu được sử dụng, các giá trị không còn được sử dụng bởi chương trình sẽ không bao giờ được thu gom rác.

Cuối cùng, nhiều người nghĩ (sai) rằng các tham chiếu yếu là hữu ích để thực hiện bộ đệm. Giữ một ref yếu trên một giá trị, nếu nó đã được thu thập rác, tải lại/recompute giá trị. Đây không phải là một thuật toán bộ nhớ cache tốt bởi vì một bộ sưu tập rác lớn reclaims bất kỳ giá trị không còn tham chiếu. Vì vậy, thuật toán bộ nhớ đệm của bạn không có khả năng dự đoán hoặc thuộc tính hữu ích như, ví dụ, kích thước bộ nhớ cache/bộ nhớ có sẵn không vượt quá một tỷ lệ nhất định.

+0

Câu trả lời rất hay, cảm ơn !! – Yttrill

1

Sử dụng cặp tính từ bản đồ sinh học giữa cấu trúc dữ liệu của bạn và biểu diễn đồng bộ có cấu trúc tương thích với mô-đun Marshall.

+0

Tôi không thể cung cấp cho bạn một đánh dấu cũng như James, mặc dù tôi muốn. Xem tiếp theo .. – Yttrill

+0

Vấn đề là đây là một bảng biểu tượng cho sơ đồ OCS, điều hiển nhiên để lưu là biểu thức s trước khi biên dịch. Vấn đề là "tiết kiệm" là một phần của Dypgen, tiết kiệm một automaton, và tôi không thể dễ dàng ngắt kết nối các chương trình biên dịch từ automaton. – Yttrill

+0

Thực ra tôi có thể làm điều đó bằng cách chỉ định mỗi hành động Parser một số nguyên, lưu và lưu riêng các biểu thức s trước khi biên dịch. Nhưng sau đó tôi có vấn đề: làm cách nào để tránh biên dịch lại mã chương trình mỗi lần sản xuất bị giảm? – Yttrill

Các vấn đề liên quan