实际使用`stackalloc`关键字

有没有人实际上用C#编程时使用stackalloc ? 我知道这是什么,但唯一一次出现在我的代码中是偶然的,因为例如,当我开始键入static时,Intellisense会提示它。

虽然它与stackalloc的使用场景没有关系,但是我实际上在我的应用程序中执行了大量的传统互操作,所以我stackalloc可以使用unsafe代码。 不过,我通常想办法避免unsafe

而且,因为.Net中的单个线程的堆栈大小是〜1Mb(纠正我,如果我错了),我更使用stackalloc保留。

是否有一些实际的情况可以说:“这是正确的数据和处理的数量和处理不安全,并使用stackalloc ”?

使用stackalloc的唯一原因是性能(用于计算或互操作)。 通过使用stackalloc而不是堆分配数组,您可以创build较less的GC压力(GC需要运行较less),不需要将数组固定在一起,分配速度比堆数组快,它会自动释放方法退出(堆分配的数组只在GC运行时解除分配)。 另外通过使用stackalloc而不是本地分配器(如malloc或.Net等价物),您也可以在范围退出中获得速度和自动释放。

性能方面,如果使用stackalloc ,由于数据的局部性,可以大大增加CPU高速caching命中的机会。

我已经使用stackalloc为[近乎]实时DSP工作分配缓冲区。 这是一个非常具体的情况,performance需要尽可能一致。 请注意,一致性和整体吞吐量之间存在差异 – 在这种情况下,我并不关心堆分配速度太慢,只是程序中当时垃圾收集的非确定性。 我不会在99%的情况下使用它。

stackalloc仅适用于不安全的代码。 对于托pipe代码,您不能决定在哪里分配数据。 值types在默认情况下分配在堆栈上(除非它们是引用types的一部分,在这种情况下,它们分配在堆上)。 引用types分配在堆上。

普通的vanilla .NET应用程序的默认堆栈大小为1 MB,但您可以在PE头中更改它。 如果你明确地启动线程,你也可以通过构造函数重载来设置不同的大小。 对于ASP.NET应用程序,默认堆栈大小只有256K,如果要在两种环境之间切换,请记住这一点。