2012-02-20 11 views
5

Chúng tôi sử dụng cấu trúc trong C# bất cứ khi nào có thể chủ yếu là vì nó được lưu trữ trên ngăn xếp và không có đối tượng nào được tạo cho nó. Điều này làm tăng hiệu suất.Nếu một mảng được sử dụng như một phần tử trong cấu trúc (C#), thì nó được lưu trữ ở đâu?

Mặt khác, mảng được lưu trữ trên heap.

Câu hỏi của tôi là, nếu tôi bao gồm một mảng như một yếu tố của cấu trúc, một cái gì đó như sau:

struct MotionVector 
{ 
    int[] a; 
    int b; 
} 

Sau đó, những gì sẽ là những hậu quả. Liệu mảng đó có được lưu trữ trên ngăn xếp không? Hoặc lợi thế hiệu suất của việc sử dụng struct sẽ bị mất?

+2

http://stackoverflow.com/questions/3942721/c-structs-versus-classes –

+1

Bạn có vấn đề về hiệu suất thực tế không? Xem http://blogs.msdn.com/b/ericlippert/archive/2009/04/27/the-stack-is-an-implementation-detail.aspx – ken2k

+0

http://stackoverflow.com/a/1114152/55209 - Một lời giải thích tuyệt vời –

Trả lời

0

Nếu bạn không muốn tạo yếu tố động, hãy cân nhắc tạo bộ đệm (lớn) của các thể hiện MotionVector trong quá trình khởi động và sử dụng lại những khi cần. Sau đó, bạn sẽ không nhận được hình phạt của việc tạo ra/phá hủy chúng một cách năng động.

Tất nhiên bạn phải viết một số chức năng nhỏ để có được một trường hợp 'miễn phí' và để có được một, sử dụng một boolean trong cấu trúc cho điều đó (hoặc bằng cách sử dụng một giao diện).

Để làm điều này bạn có thể ví dụ:

Tạo trong khởi động của ứng dụng của bạn motionvectors:

MotionVectors motionVectors; 

Thêm một boolean đến lớp MotionVector:

public class MotionVector 
{ 
    bool InUse { get; set; } 

    public MotionVector() 
    { 
     InUse = false; 
    } 
} 

Xác định lớp mới MotionVectors:

class MotionVectors 
{ 
    MotionVector _instances[100]; 

    public void Free(MotionVector vector) 
    { 
     var index = 'search vector in _instances' 
     _instances[index].Inuse = false; 
    } 

    public MotionVector GetNewInstance() 
    { 
     var index = 'first free vector in _instances' 
     _instances[index].Inuse = true; 
     return _instances[index]; 
    } 
} 
+0

điều này có vẻ là một ý tưởng thực sự tốt. Cảm ơn bạn rất nhiều. Bạn có thể chỉ ra một vài ví dụ về cách làm điều đó không? – shahensha

+0

Tôi sợ tôi không có ví dụ thực sự, tuy nhiên tôi sẽ thích ứng với câu trả lời của tôi một chút. –

+0

Cảm ơn rất nhiều @Michel – shahensha

8

Chỉ con trỏ vào mảng sẽ được lưu trữ trong ngăn xếp. Mảng thực tế sẽ được lưu trữ trong heap.

1

int[] a là loại tham chiếu, nghĩa là tham chiếu một mảng các số nguyên. 'Tham chiếu' sẽ được lưu trữ trên ngăn xếp. Tuy nhiên, các dữ liệu mà nó tham chiếu sẽ được lưu trữ trên heap khi bạn làm điều gì đó như thế này:

MotionVector z; 
z.a = new int[10]; 
1

Bạn sẽ tổ chức một tham chiếu đến một trong struct của bạn; đó sẽ là một phần của cấu trúc trên ngăn xếp.

Đối tượng int [] thực tế, nếu/khi bạn khởi tạo nó, sẽ đi bất cứ nơi nào nó sẽ đi nếu không (phần lớn trong hầu hết các kiến ​​trúc).

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