26

stackalloc关键字提供什么功能?我何时以及为什么要使用它?

4

7 回答 7

19

来自MSDN

在不安全的代码上下文中用于在堆栈上分配一块内存。

C# 的主要特性之一是您通常不需要直接访问内存,就像在 C/C++ 中使用mallocor所做的那样new。但是,如果您真的想显式分配一些内存,您可以,但是 C# 认为这是“不安全的”,因此您只能在使用该unsafe设置进行编译时执行此操作。stackalloc允许您分配这样的内存。

您几乎可以肯定不需要使用它来编写托管代码。在某些情况下,如果您直接访问内存,您可以编写更快的代码是可行的——它基本上允许您使用适合某些问题的指针操作。除非你有一个特定的问题并且不安全的代码是唯一的解决方案,否则你可能永远不需要这个。

于 2009-04-06T12:51:22.257 回答
16

Stackalloc 将在堆栈上分配数据,这可用于避免在方法内重复创建和销毁值类型数组所产生的垃圾。

public unsafe void DoSomeStuff()
{
    byte* unmanaged = stackalloc byte[100];
    byte[] managed = new byte[100];

    //Do stuff with the arrays

    //When this method exits, the unmanaged array gets immediately destroyed.
    //The managed array no longer has any handles to it, so it will get 
    //cleaned up the next time the garbage collector runs.
    //In the mean-time, it is still consuming memory and adding to the list of crap
    //the garbage collector needs to keep track of. If you're doing XNA dev on the
    //Xbox 360, this can be especially bad.
}
于 2010-05-29T18:06:18.610 回答
9

保罗,

正如这里的每个人所说,该关键字指示运行时在堆栈而不是堆上分配。如果您对这究竟意味着什么感兴趣,请查看这篇文章

于 2009-04-06T12:56:08.267 回答
3

http://msdn.microsoft.com/en-us/library/cx9s2sy4.aspx

this 关键字用于处理不安全的内存操作。通过使用它,您可以使用指针(C/C++ 中一个强大而痛苦的特性)

于 2009-04-06T12:51:57.340 回答
2

stackalloc指示 .net 运行时在堆栈上分配内存。

于 2009-04-06T12:52:25.623 回答
2

大多数其他答案都集中在OP问题的“什么功能”部分。
我相信这将回答何时以及为什么:

你什么时候需要这个?
使用多个小型阵列的缓存局部性获得最佳的最坏情况性能。

现在在一个普通的应用程序中你不需要这个,但对于实时敏感的场景,它提供了更多的确定性性能:不涉及 GC,你几乎可以保证缓存命中。
(因为最坏情况下的性能比平均性能更重要。)

请记住,.net 中的默认堆栈大小虽然很小!
(我认为普通应用程序为 1MB,ASP.net 为 256kb?)

例如,实际使用可以包括实时声音处理。

于 2016-04-03T09:35:36.127 回答
0

就像史蒂夫指出的那样,仅在不安全的代码上下文中使用(例如,当您想使用指针时)。

如果您不在 C# 应用程序中使用不安全代码,那么您将永远不需要它。

于 2009-04-06T12:54:21.063 回答