2011-10-18 38 views
8

thể trùng lặp:
C# parameters by reference and .net garbage collectionphần tử mảng Đi qua bởi ref

Tôi đã nghĩ đến việc sử dụng đối số ref để hạn chế kiểm tra giới hạn của một mảng. Ví dụ mã của trao đổi hai yếu tố là:

class Test { 
    int[] array; 

    private void qSort() { 
    ...blah... 
    int temp = array[a]; 
    array[a] = array[b]; 
    array[b] = temp; 
    } 
} 

trong đó có 4 quyền truy cập vào các mảng thay thế sẽ là:

class Test { 
    int[] array; 

    private void qSort() { 
    ...blah... 
    Swap(ref array[a], ref array[b]); 
    } 

    static void Swap(ref int a,ref int b) { 
    int temp = a; 
    a=b; 
    GC.Collect(); // suppose this happens 
    b=temp; 
    } 
} 

mà về mặt lý thuyết chỉ có 2 truy cập vào các mảng

Điều làm tôi bối rối là tôi không biết chính xác điều gì xảy ra khi tôi chuyển một phần tử mảng bằng ref. Nếu Garbage Collector khởi động, trong khi thực thi mã trong hàm Swap, sẽ có thể di chuyển mảng? hoặc mảng được ghim trong suốt thời gian của cuộc gọi?

Hãy nhớ rằng mã trên là một trường hợp thử nghiệm đơn giản. Tôi muốn sử dụng nó trong các tình huống phức tạp hơn nhiều

Edit: Theo BrokenGlass chỉ ra, điều này được trả lời bởi Eric Lippert đây C# parameters by reference and .net garbage collection

Mảng sẽ không được ghim và GCollector thể di chuyển nó và sẽ cập nhật accordinly ref nào đến một phần tử của nó, mà nằm trên stack

+2

Đừng cố gắng tối ưu hóa sớm, * đặc biệt là * nếu bạn không có kiến ​​thức sâu về cách thức hoạt động của máy móc. Trường hợp tại điểm: phiên bản thứ hai của bạn (với 'ref') sẽ thực sự * nhiều * chậm hơn lần đầu tiên do boxing (thử nó trong vòng lặp và xem). – Jon

+4

@ Jon, tôi đồng ý rằng có lẽ không có điểm trong việc này vì lý do hiệu suất, nhưng nó cải thiện khả năng đọc ... Và BTW, không có boxing trong trường hợp đó –

+0

Panos, thêm GC.Collect() để nhấn mạnh điểm , quay lại nếu bạn không thích. –

Trả lời

0

các ngăn xếp có thể trông như thế này:

  • qsort() có một tham chiếu đến mảng
  • Swap()

Vì vậy, nếu GC.Collect() thực hiện trong trao đổi vẫn có tham chiếu đến mảng trong qSort() có nghĩa là nó sẽ không được thu thập.

0

Chức năng Swap vẫn truy cập mảng 3 hoặc 4 lần, hàm Hoán đổi không cung cấp bất kỳ hiệu suất quảng cáo nào trên mã đơn giản hơn. Nó có thể hữu ích nếu nó được tái sử dụng.

static void Swap(ref int a,ref int b) 
{  
    int temp = a; //<-- Here, a is in the array 
    a=b;   //<-- a and b are in the array 
    b=temp;  //<-- b is in the array 
} 

Các nhà sưu tập rác sẽ không giải phóng bộ nhớ bạn có một tài liệu tham khảo đến, như xảy ra khi bạn vượt qua bằng cách tham khảo.

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