2010-02-26 51 views
17

Tôi biết rằng loại tham chiếu sẽ được thu thập rác. Tôi muốn biết liệu các loại giá trị cũng sẽ được thu thập rác từ ngăn xếp?Các loại giá trị có được thu gom rác không?

+0

Bạn có thể xác định một cách cẩn thận "rác thu được" có ý nghĩa gì đối với bạn không? –

+0

Ý tôi là "rác thu thập" là, nếu một biến kiểu giá trị được tìm thấy không được ứng dụng sử dụng thì nó sẽ bị loại bỏ khỏi ngăn xếp. – csharpbaby

+0

Tôi nghĩ Eric đã giải thích điều này rất rõ ràng, nhưng hãy để tôi trả lời trực tiếp hơn, chỉ để chắc chắn: Một biến cục bộ sẽ vẫn được phân bổ miễn là nó nằm trong phạm vi, bất kể có tham chiếu gì khác không. Nó không phải là tùy thuộc vào bộ sưu tập, chỉ phạm vi. –

Trả lời

31

Không rõ câu hỏi của bạn có ý nghĩa gì. Bạn có thể cẩn thận xác định những gì "rác thu thập" có nghĩa là? Nó có nghĩa là "là đầu vào cho thuật toán GC", hoặc "được deallocated bằng cách nén GC đống", hoặc những gì?

Giá trị được lưu trữ trên ngăn xếp - cho dù giá trị của các loại giá trị hoặc loại tham chiếu - là rễ của thuật toán thu thập. Chúng là không được thu thập bởi vì chúng là những thứ còn sống mà giữ hầu hết mọi thứ khác còn sống.

Và rõ ràng là chúng không được phân phối bằng cách nén gọn GC; chúng được deallocated bằng cách popping stack.

Điều đó có trả lời câu hỏi của bạn không?

UPDATE:

Những gì tôi có nghĩa là bằng cách "thu gom rác thải" là rằng, nếu một biến kiểu giá trị là thấy không được sử dụng bởi các ứng dụng sau đó nó sẽ được gỡ bỏ từ stack

OK, chúng tôi đang tiến gần hơn đến một câu hỏi có thể trả lời ở đây tôi nghĩ. Bây giờ chúng ta cần phải hiểu chính xác những gì bạn có ý nghĩa của "loại bỏ từ ngăn xếp".

Ngăn xếp là một khối bộ nhớ được phân bổ trước một triệu byte có kích thước. Đôi khi chúng tôi sử dụng các phần của khối bộ nhớ đó để lưu trữ các biến cục bộ của loại giá trị. Điều gì làm bạn có ý nghĩa chính xác bởi "loại bỏ từ ngăn xếp"? Ngăn xếp không bao giờ thay đổi về kích thước; đó là một khối một triệu byte của bộ nhớ được phân bổ trước.

Ngăn xếp được chia thành hai khu vực tiếp giáp, chúng tôi sẽ gọi các phần "hợp lệ" và "không hợp lệ" của ngăn xếp. Trên kiến ​​trúc x86, các thanh ghi ESP trỏ tới ranh giới giữa các vùng đó. Bạn đang hỏi "dưới điều kiện nào bộ nhớ liên kết với một biến cục bộ của loại giá trị trên ngăn xếp trở thành một phần của phần không hợp lệ dựa trên sự thay đổi giá trị của thanh ghi ESP trên kiến ​​trúc x86?"

Điều này có vẻ giống như phiên bản "chi tiết triển khai" của câu hỏi của bạn. Ngăn xếp là chi tiết triển khai phiên bản cụ thể của thời gian chạy, vì vậy nếu bạn định đặt câu hỏi về nó, bạn sẽ phải chấp nhận thực tế là bạn đang hỏi về một giá trị cụ thể trong một đăng ký trên một kiến ​​trúc chip cụ thể.

Đọc thêm:

http://blogs.msdn.com/ericlippert/archive/2009/02/17/references-are-not-addresses.aspx

http://blogs.msdn.com/ericlippert/archive/2009/04/27/the-stack-is-an-implementation-detail.aspx

http://blogs.msdn.com/ericlippert/archive/2009/05/04/the-stack-is-an-implementation-detail-part-two.aspx

http://blogs.msdn.com/ericlippert/archive/2009/06/08/out-of-memory-does-not-refer-to-physical-memory.aspx

Tôi là một chút bối rối hiện nay để đọc những gì bạn đã đề cập về "giá trị" và "v loại alue ".Tôi thấy khó hiểu được sự khác biệt.

Rất khó! Chúng tôi sử dụng từ "giá trị" và "tham chiếu" để có nghĩa là quá nhiều thứ. Hãy để tôi tổng hợp.

Biến là vị trí lưu trữ.

Mọi biến có loại. Loại có thể là loại giá trị hoặc loại tham chiếu.

Vị trí lưu trữ có chứa giá trị .

Giá trị của một biến loại giá trị là giá trị của loại giá trị. Ví dụ, int là một kiểu giá trị. Giá trị của một biến kiểu int là một int, ví dụ, 12.

Giá trị của một biến kiểu tham chiếu là tham chiếu đến một đối tượng thuộc kiểu đó, hoặc null. Ví dụ, chuỗi là một kiểu tham chiếu. Giá trị của một biến kiểu chuỗi là tham chiếu đến một chuỗi hoặc null.

Đó là lý do tại sao chúng được gọi là "loại giá trị" và "loại tham chiếu". Giá trị của một loại giá trị là một thể hiện của loại. Giá trị của một loại tham chiếu là một tham chiếu đến một thể hiện của kiểu.

Bây giờ điều đó có hợp lý không?

+0

Cảm ơn. Điều này xóa tất cả những nghi ngờ của tôi :-). Cảm ơn lời giải thích tuyệt vời này. (PS: Tôi là một fan hâm mộ lớn của bạn. Tôi đã gây ấn tượng với bạn bè của tôi bằng cách chia sẻ kiến ​​thức từ blog của bạn!) – csharpbaby

+0

@csharpbaby: Bạn được chào đón.Tôi đã đặt một số liên kết đến một số bài viết trên blog mà bạn có thể thấy thú vị trong văn bản ở trên. –

7

Thời gian chạy ngôn ngữ chung (CLR) cấp phát bộ nhớ cho các đối tượng ở hai nơi: ngăn xếp và vùng lưu trữ.

Loại giá trị được lưu trữ trên ngăn xếp cùng với tham chiếu đến nội dung loại tham chiếu được lưu trữ trên heap. Điểm của bộ thu gom rác là để deallocate bộ nhớ được gán cho nội dung kiểu tham chiếu trên heap khi tham chiếu được xuất hiện từ stack.

Loại giá trị không phải là nội dung của loại tham chiếu không được lưu trữ trên heap để nó không được dọn dẹp bởi bộ thu gom rác.

See here for a slightly more in depth description of value vs reference types

See here for a lot more in depth description

+4

Các loại giá trị không nhất thiết được lưu trữ trên ngăn xếp. Câu lệnh đúng là "các giá trị kiểu giá trị là các kho lưu trữ tạm thời hoặc biến cục bộ không được đóng trên các địa phương của một phương thức ẩn danh hoặc biểu thức lambda và không nằm trong khối lặp được lưu trữ trên ngăn xếp trong triển khai thực hiện CLI của Microsoft. " Một loại giá trị không nằm trên vùng đệm GC không được bộ thu gom rác dọn sạch. Một loại giá trị * là * trên đống GC * được * dọn dẹp bởi bộ thu gom rác. –

+1

+1 Đồng ý, nhưng cố gắng chuyển đổi câu trả lời đó thành câu trả lời rõ ràng và ngắn gọn dễ hiểu là một thách thức ;-) –

+0

Bạn nói đúng. Tôi nghĩ rằng tôi đang suy nghĩ rất chăm chỉ sau khi Eric viết "Giá trị của loại giá trị". :) – csharpbaby

1

Giả sử bạn có nghĩa là "thu gom rác thải" theo nghĩa của các bộ thu rác kiểm tra nếu họ còn sống và sau đó khai hoang bộ nhớ thì câu trả lời là không có họ không được "thu gom rác thải" .

Lý do là bộ nhớ trên ngăn xếp được tự động khôi phục khi khung ngăn xếp được xóa.

Đọc bài viết này: http://en.wikipedia.org/wiki/Stack_%28data_structure%29#Hardware_stacks

+0

Cảm ơn Paolo. Tôi sẽ đọc bài viết này :) – csharpbaby