我们尽可能在C#中使用struct,主要是因为它存储在堆栈中,并且没有为它创建对象。这提高了性能。如果一个数组被用作struct(C#)中的一个元素,它在哪里存储?
另一方面,数组存储在堆上。
我的问题是,如果我有一个数组作为结构的元素,东西如下:
struct MotionVector
{
int[] a;
int b;
}
那么会有什么后果。该数组将被存储在堆栈上吗?或者使用struct的性能优势会丢失?
我们尽可能在C#中使用struct,主要是因为它存储在堆栈中,并且没有为它创建对象。这提高了性能。如果一个数组被用作struct(C#)中的一个元素,它在哪里存储?
另一方面,数组存储在堆上。
我的问题是,如果我有一个数组作为结构的元素,东西如下:
struct MotionVector
{
int[] a;
int b;
}
那么会有什么后果。该数组将被存储在堆栈上吗?或者使用struct的性能优势会丢失?
如果您不想动态创建元素,请考虑在启动期间创建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];
}
}
只有指向数组的指针才会存储在堆栈中。实际的数组将被存储在堆中。
int[] a
是一个引用类型,即它引用一个整数数组。 '参考'本身将被存储在堆栈中。但是,当你做这样的事情的数据对它的引用将被存储在堆上:
MotionVector z;
z.a = new int[10];
你会在你的结构持有一个参考;这将成为堆栈结构的一部分。
实际的int []对象,如果/当你初始化它时,它会去的地方否则(大多数体系结构中的堆)。
http://stackoverflow.com/questions/3942721/c-structs-versus-classes – 2012-02-20 10:35:44
你有实际的性能问题吗?见http://blogs.msdn.com/b/ericlippert/archive/2009/04/27/the-stack-is-an-implementation-detail.aspx – ken2k 2012-02-20 10:40:16
http://stackoverflow.com/a/1114152/55209 - 一个很好的解释 – 2012-02-20 10:40:31