2012-02-20 57 views
5

我们尽可能在C#中使用struct,主要是因为它存储在堆栈中,并且没有为它创建对象。这提高了性能。如果一个数组被用作struct(C#)中的一个元素,它在哪里存储?

另一方面,数组存储在堆上。

我的问题是,如果我有一个数组作为结构的元素,东西如下:

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

那么会有什么后果。该数组将被存储在堆栈上吗?或者使用struct的性能优势会丢失?

+2

http://stackoverflow.com/questions/3942721/c-structs-versus-classes – 2012-02-20 10:35:44

+1

你有实际的性能问题吗?见http://blogs.msdn.com/b/ericlippert/archive/2009/04/27/the-stack-is-an-implementation-detail.aspx – ken2k 2012-02-20 10:40:16

+0

http://stackoverflow.com/a/1114152/55209 - 一个很好的解释 – 2012-02-20 10:40:31

回答

0

如果您不想动态创建元素,请考虑在启动期间创建MotionVector实例的(大)缓冲区,并在需要时重新使用这些缓冲区。那么你将不会受到以动态方式创建/破坏它们的惩罚。

当然,你必须编写一些小函数来获得一个'自由'实例并获得一个,在结构中使用布尔值(或通过使用接口)。

要做到这一点,你可以例如:

MotionVectors motionVectors; 

添加一个boolean值以MotionVector类:

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

    public MotionVector() 
    { 
     InUse = false; 
    } 
} 

定义新类

您的应用程序初始化的motionvectors期间创建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

这似乎是一个非常好的主意。非常感谢。你能指出一些关于如何做的例子吗? – shahensha 2012-02-20 11:05:00

+0

恐怕我没有真实的例子,但是我会稍微调整我的答案。 – 2012-02-20 11:40:34

+0

非常感谢@Michel – shahensha 2012-02-20 14:16:51

8

只有指向数组的指针才会存储在堆栈中。实际的数组将被存储在堆中。

1

int[] a是一个引用类型,即它引用一个整数数组。 '参考'本身将被存储在堆栈中。但是,当你做这样的事情的数据对它的引用将被存储在堆上:

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

你会在你的结构持有一个参考;这将成为堆栈结构的一部分。

实际的int []对象,如果/当你初始化它时,它会去的地方否则(大多数体系结构中的堆)。

相关问题