【发布时间】:2009-04-06 12:49:03
【问题描述】:
stackalloc 关键字提供什么功能?我什么时候以及为什么要使用它?
【问题讨论】:
-
@Paul:我只是修改了问题以添加更多内容。您最初的措辞实际上没有任何问题。
-
有人可以说明何时有人需要在答案中使用不安全的操作吗?
标签: c# keyword stackalloc
stackalloc 关键字提供什么功能?我什么时候以及为什么要使用它?
【问题讨论】:
标签: c# keyword stackalloc
来自MSDN:
用于在不安全的代码上下文中分配内存块 堆栈。
C# 的主要特性之一是您通常不需要直接访问内存,就像在 C/C++ 中使用 malloc 或 new 所做的那样。但是,如果你真的想显式分配一些内存,你可以,但 C# 认为这是“不安全的”,所以你只能在编译时使用 unsafe 设置。 stackalloc 允许你分配这样的内存。
您几乎可以肯定不需要使用它来编写托管代码。在某些情况下,如果您直接访问内存,您可以编写更快的代码是可行的——它基本上允许您使用适合某些问题的指针操作。除非您遇到特定问题并且不安全的代码是唯一的解决方案,否则您将可能永远不需要这个。
【讨论】:
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.
}
【讨论】:
managed 无论如何都可能在堆栈上分配。
保罗,
正如这里的每个人所说,该关键字指示运行时在堆栈而不是堆上分配。如果您对这意味着什么感兴趣,请查看this article。
【讨论】:
http://msdn.microsoft.com/en-us/library/cx9s2sy4.aspx
此关键字用于处理不安全的内存操作。通过使用它,您可以使用指针(C/C++ 中一个强大而痛苦的特性)
【讨论】:
stackalloc 指示 .net 运行时在堆栈上分配内存。
【讨论】:
大多数其他答案都集中在 OP 问题的“什么功能”部分。
我相信这将回答何时以及为什么:
您什么时候需要这个?
通过多个小数组的缓存局部性获得最佳的最坏情况性能。
现在在普通应用程序中您不需要这个,但对于实时敏感的场景,它提供了更多确定性的性能:不涉及 GC,几乎可以保证缓存命中。
(因为最坏情况下的性能比平均性能更重要。)
请记住,.net 中的默认堆栈大小很小!
(我认为普通应用程序为 1MB,ASP.net 为 256kb?)
实际用途可能包括实时声音处理。
【讨论】:
就像史蒂夫指出的那样,只在不安全的代码上下文中使用(例如,当你想使用指针时)。
如果您不在 C# 应用程序中使用不安全代码,那么您将永远需要它。
【讨论】: