C#中是否可以使用基于堆栈的数组?

时间:2010-03-16 16:16:29

标签: c# .net arrays stack

让我们说假设(读:我不认为我真的需要这个,但我很好奇,因为这个想法突然出现在我的脑海中),人们希望在堆栈上本地预留一个内存数组,而不是在堆上。例如,像这样:

private void someFunction()
{
    int[20] stackArray; //C style; I know the size and it's set in stone
}

我猜答案是否定的。我能找到的只是基于堆的数组。如果有人需要这个,那会有任何解决方法吗?有没有办法以“值类型”方式留出一定数量的顺序存储器?或者是具有命名参数的结构的唯一方法(就像XNA中的Matrix struct有16个命名参数(M11-M44))?

2 个答案:

答案 0 :(得分:4)

你想要的是stackalloc;不幸的是,您只能在不安全的代码中使用它,这意味着它不会在有限的权限上下文中运行。

您还可以为每种元素类型创建一个包含必要数量变量的结构,但是对于您想要使用的每个“数组”大小,您需要一个新类型

答案 1 :(得分:0)

我能想到的基于堆栈的数组最接近的是手动嵌套结构;对于大小为N ^ M的数组,代码大小为O(MN),访问时间为O(M);可以方便地缩放M和N(例如,可以处理4096个元素阵列作为六深嵌套4元素结构,四深嵌套8元素结构或三深嵌套16元素结构,两个深嵌套64元素结构等)如果想要对16个元素阵列进行三深嵌套(可能是最实际的权衡),可以使用字段f0到f15定义一个16元素的结构,并使用一种访问方法切换/案例以选择元素。然后可以定义那些的16元素结构,这些元素的16元素结构等等。

一般来说,使用标准数组比使用值类型结构来模拟数组更容易,但有时候有一个数组类型的东西,因为值类型将是有利的。然而,值类型数组的优点往往受限于.net,它在处理通过引用操作值类型时存在一些限制。如果可以通过编写“MyArrayishThing [1] [2] [3]”从上面描述的数组中简单地访问元素0x123,那将是很好的,这对于读取来说是低效的并且对于写入无效(因为子表达式MyArrayishThing [1] ]将制作一个包含数组256个元素的结构的副本。相反,必要的是通过引用MyArrayishThing [1]来传递一个例程,该例程可以访问它的元素2并通过引用传递它来访问它的元素3。可以有效地做到这一点,但代码最终看起来很讨厌。