stackalloc
关键字提供哪些功能?何时以及为什么要使用它?
答案 0 :(得分:18)
来自MSDN:
在不安全的代码上下文中用于分配内存块 叠加。
C#的一个主要功能是您通常不需要直接访问内存,就像使用malloc
或new
在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)。
实际使用可以包括实时声音处理。