我什么时候需要在C#中使用stackalloc关键字?

时间:2009-04-06 12:49:04

标签: c# keyword stackalloc

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

7 个答案:

答案 0 :(得分:18)

来自MSDN

  

在不安全的代码上下文中用于分配内存块   叠加。

C#的一个主要功能是您通常不需要直接访问内存,就像使用mallocnew在C / C ++中一样。但是,如果你真的想明确地分配一些内存,但是C#认为这是“不安全的”,所以只有在使用unsafe设置进​​行编译时才能这样做。 stackalloc允许您分配这样的内存。

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

答案 1 :(得分:15)

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.
}

答案 2 :(得分:9)

保罗,

正如大家都说的那样,该关键字指示运行时在堆栈而不是堆上进行分配。如果您对这意味着什么感兴趣,请查看this article

答案 3 :(得分:3)

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

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

答案 4 :(得分:2)

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

大多数其他答案都集中在OP问题的“功能性”部分 我相信这将回答时间和原因:

你什么时候需要这个?
对于具有多个小数组的缓存局部性的最佳最坏情况性能。

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

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

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