何时在c#中的堆栈上分配数组?

时间:2015-08-28 15:01:59

标签: c# arrays stack heap allocation

我一直在试图找出什么时候在堆栈上分配的东西,我无法弄清楚你如何在堆栈上分配数组(或者更确切地说是值);

在这个例子中

public void foo()
{
    int bar[] = new int [10];
}

将在堆上分配10个int结构,只有指向它们的指针才会在堆栈上,对吗?

如何使固定大小的数组进入堆栈?如果我使用的是我定义的结果怎么办?

如果我希望将数组大小作为参数传递给函数怎么办?

据我所知,调用函数时,如果在调用函数时已知大小,则在堆栈上获取任意大小的数组应该没有问题。

我是否应该为此烦恼?据我所知,在堆栈上获取这个固定大小的数组会提高性能,因为没有完成堆分配。

1 个答案:

答案 0 :(得分:15)

  

将在堆上分配10个int结构,只有指向它们的指针才会在堆栈上,对吗?

是的,没错。

  

如何使固定大小的数组进入堆栈?如果我使用我定义的结构会怎么样?

stackalloc keyword就是为了这个目的。但是,这只适用于不安全的环境,这在大多数情况下都是一个相当不必要的限制因素,不值得进行性能权衡。

示例:

public void unsafe foo()
{
    int* bar = stackalloc int [10];
}

您必须使用pointer arithmetic来访问阵列的成员。

  

如果我想将数组大小作为参数传递给函数怎么办?   据我所知,当调用函数时,如果在调用函数时已知大小,则在堆栈上获取任意大小的数组应该没有问题。

按预期工作:

public void unsafe foo(int length)
{
    int* bar = stackalloc int [length];
}
  

我是否应该为此烦恼?据我所知,在堆栈上获取这个固定大小的数组会提高性能,因为没有完成堆分配。

不,一般不会。除非您处理一些非常具体的性能关键场景,例如繁重的数学计算,加密,压缩等,否则它不会带来任何实际好处。

另外,请参阅this question了解与效果相关的讨论。