如果数组用作struct(C#)中的元素,它存储在哪里?

如果数组用作struct(C#)中的元素,它存储在哪里?,c#,arrays,struct,stack,heap,C#,Arrays,Struct,Stack,Heap,我们尽可能在C#中使用struct,主要是因为它存储在堆栈上,并且没有为它创建对象。这提高了性能 另一方面,数组存储在堆上 我的问题是,如果我将数组作为结构的一个元素,则如下所示: struct MotionVector { int[] a; int b; } 那么后果会是什么呢。该数组将存储在堆栈上吗?或者使用struct的性能优势将丢失?只有指向数组的指针将存储在堆栈中。实际数组将存储在堆中。int[]a是一种引用类型,即它引用一个整数数组。“引用”本身将存储在堆栈上。但是

我们尽可能在C#中使用struct,主要是因为它存储在堆栈上,并且没有为它创建对象。这提高了性能

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

我的问题是,如果我将数组作为结构的一个元素,则如下所示:

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

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

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

int[]a
是一种引用类型,即它引用一个整数数组。“引用”本身将存储在堆栈上。但是,当您执行以下操作时,它引用的数据将存储在堆上:

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

您将在结构中保留对a的引用;这将是堆栈上结构的一部分


实际的INT[]对象,如果/初始化时,将去到它所要去的任何地方(大多数架构中的堆)。

< P>如果你不想动态地创建元素,考虑在启动期间创建一个(大)缓冲向量实例,并在需要的时候重用它。那么你就不会因为动态地创建/破坏它们而受到惩罚

当然,您必须编写一些小函数来获得“free”实例,要获得一个,请在结构中使用布尔值(或使用接口)

为此,您可以,例如:

在应用程序初始化期间创建MotionVector:

MotionVectors motionVectors;
将布尔值添加到MotionVector类:

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

    public MotionVector() 
    {
        InUse = false; 
    }
}
定义新类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];
    }
}

您是否有实际的性能问题?看到了吗?非常棒explanation@ken2k我确实有性能问题。我正在做一个实时手势识别系统。任何改进逻辑的方法都将受到高度赞赏!这似乎是个好主意。非常感谢你。你能举出几个例子来说明怎么做吗?恐怕我没有真正的例子,不过我会对我的答案稍加修改。