2012-07-25 32 views
5

Tôi đã tự hỏi,Cấu trúc với các loại tham chiếu và GC?

Một thể hiện của lớp là trên Heap. (các loại giá trị bên trong nó cũng nằm trong vùng heap).

Nhưng còn trường hợp đối diện trường hợp thì sao?

Có một câu hỏi here nhưng nó đã không đề cập đến bất kỳ thông tin liên quan GC.

Vậy - GC xử lý tình huống này như thế nào?

public struct Point 
{ 
object o ; 

    public int x, y; 

    public Point(int p1, int p2) 
    { 
    o = new Object(); 
     x = p1; 
     y = p2;  
    } 
} 

Trả lời

7

Point bao gồm tham chiếu đến đối tượng trên heap. Điều này sẽ đủ điều kiện để thu thập ngay sau khi không còn bản sao nào của số đó Point cùng với tham chiếu đó. Lưu ý rằng:

Point p1 = new Point(1,2); 
Point p2 = p1; 

là 2 bản, mỗi với một tham chiếu đến đối tượng cùng trên heap. Nếu những điểm đó được lưu trữ dưới dạng các trường trên một đối tượng ở đâu đó, thì rõ ràng tuổi thọ của đối tượng sẽ ít nhất là miễn là đối tượng có các trường đó. Nếu những điểm đó chỉ là các biến trên ngăn xếp, thì nó sẽ trở nên phức tạp hơn, bởi vì GC có thể xem xét liệu biến có bao giờ là đọc lại hay không. Nếu không, biến có thể không tồn tại hiệu quả (hoặc: có thể).

Đường dẫn có thể rất gián tiếp, nhưng về cơ bản nó đi xuống: GC có thể đến đối tượng, bắt đầu từ rễ GC hay không.

+0

marc I ** Don't ** muốn hỏi xem liệu cấu trúc này có phải là thành viên của một lớp thể hiện không. :) :) –

+0

@RoyiNamir Đơn giản, tất cả chúng sẽ nằm trên heap; -) –

+0

@RoyiNamir GC sẽ đặt câu hỏi đó mặc dù –

3

Các GC không tìm kiếm rễ đối tượng trong

  • Handles GC (biến tĩnh là rễ mà là GC Xử lý cũng)
  • Tất cả Chủ đề Cộng dồn
  • CPU Thanh ghi

Trong trường hợp của bạn là cấu trúc thường nằm bên trong ngăn xếp luồng và do đó được tìm kiếm. Nếu nó được đóng hộp thì nó nằm trên heap được quản lý như một đối tượng giả. Nhưng bạn có thể yên tâm rằng điều này được tính một cách chính xác bởi GC. Vì nó có chứa một đối tượng, nó không phải là một kiểu blittable nữa và không thể được chuyển tới mã không được quản lý thông qua PInvoke. Có một vấn đề với PInvokes nếu bạn vượt qua một cấu trúc cho nó rằng nó sẽ được GC ngay cả khi cuộc gọi unmaanged vẫn đang trong tiến trình mà bạn nhận được chỉ trong bản phát hành bản phát hành vì gỡ lỗi xây dựng tuổi thọ của các biến được mở rộng cho đến khi phương pháp còn lại. Trong chế độ phát hành, GC thu thập dữ liệu tích cực hơn nhiều.

Chỉnh sửa1: Các thành viên trong lớp không có trường hợp đặc biệt. GC wil kiểm tra tất cả các trường lớp cho các tham chiếu lớp trong các cấu trúc nhúng.

+0

Có nhiều http://stackoverflow.com/questions/9938186/gc-roots-misunderstanding –

0

Vị trí lưu trữ của loại cấu trúc có thể được coi là tập hợp các vị trí lưu trữ được gắn chặt với băng dính thương hiệu Duck ®; bản chất của các vị trí lưu trữ được gắn chặt với nhau sẽ là vị trí của cấu trúc. Nếu một cấu trúc được lưu trữ trên ngăn xếp, các trường của nó sẽ được lưu trữ trên ngăn xếp; nếu cấu trúc được lưu trữ trong một trường đối tượng đống, các trường của nó sẽ được lưu trữ như là một phần của đối tượng heap đó; v.v.Nếu một cấu trúc được lưu trữ trong một vị trí lưu trữ có thể thay đổi, các trường của nó (công khai hoặc riêng tư) sẽ có thể thay đổi được (ngay cả khi cấu trúc không cung cấp đột biến, sao chép cấu trúc này sang cấu trúc khác sẽ thay đổi cấu trúc này bằng cách ghi đè trường của nó bằng các trường tương ứng trong cái cũ). Nếu một cấu trúc được lưu trữ trong một vị trí lưu trữ bất biến, tất cả các trường của nó sẽ không thay đổi.

Nếu bạn xem mọi thứ theo cách đó, sẽ dễ hiểu rằng hành vi GC của một cấu trúc về cơ bản giống với hành vi của GC bằng cách thay thế cấu trúc bằng các trường riêng biệt (vị trí quan trọng duy nhất hành vi là 'bất thường' là với mảng, vì thông thường một mảng mảng chỉ giữ một mục chứ không phải là tập hợp các trường; không có cấu trúc không tương đương với một mảng của một kiểu cấu trúc).

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