有没有人在用C#编程时真的用过stackalloc?我知道它在做什么,但它唯一一次出现在我的代码中是偶然的,因为例如,当我开始输入static时,智能感知会建议它。
尽管它与stackalloc的使用场景无关,但我实际上在我的应用程序中做了大量的遗留互操作,因此我可以时不时地求助于使用unsafe代码。但尽管如此,我通常还是会想办法完全避免使用unsafe。
而且由于.Net中单个线程的堆栈大小约为1Mb(如果我错了,请纠正我),所以我甚至更加保留不使用stackalloc。
有没有一些实际案例中,有人会说:“这正是我不安全地使用stackalloc的正确数量的数据和处理”?
发布于 2009-04-24 10:08:32
使用stackalloc的唯一原因是性能(无论是用于计算还是互操作)。通过使用stackalloc而不是堆分配的数组,您创建的GC压力更小( GC需要运行的更少),您不需要固定数组,分配比堆数组更快,并且它在方法退出时自动释放(仅在GC运行时释放堆分配的数组)。此外,通过使用stackalloc而不是本机分配器(如malloc或.Net等效物),还可以提高速度并在作用域退出时自动释放。
在性能方面,如果您使用stackalloc,由于数据的局部性,您将大大增加缓存命中CPU的机会。
发布于 2009-04-24 10:26:28
我使用stackalloc为接近实时的DSP工作分配缓冲区。这是一个非常特殊的情况,性能需要尽可能保持一致。注意一致性和总体吞吐量之间是有区别的--在这种情况下,我并不担心堆分配太慢,只是关心程序中那个时间点的垃圾收集的不确定性。我不会在99%的情况下使用它。
发布于 2009-04-24 10:03:51
stackalloc只与不安全的代码相关。对于托管代码,您无法决定将数据分配到何处。默认情况下,值类型在堆栈上分配(除非它们是引用类型的一部分,在这种情况下,它们是在堆上分配的)。引用类型在堆上分配。
普通.NET应用程序的默认堆栈大小是1MB,但您可以在PE头中更改此大小。如果你显式启动线程,你也可以通过构造函数重载来设置一个不同的大小。对于ASP.NET应用程序,默认堆栈大小仅为256K,如果您要在两种环境之间切换,请记住这一点。
https://stackoverflow.com/questions/785226
复制相似问题