首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >`stackalloc`关键字的实际用法

`stackalloc`关键字的实际用法
EN

Stack Overflow用户
提问于 2009-04-24 09:51:31
回答 5查看 33.7K关注 0票数 168

有没有人在用C#编程时真的用过stackalloc?我知道它在做什么,但它唯一一次出现在我的代码中是偶然的,因为例如,当我开始输入static时,智能感知会建议它。

尽管它与stackalloc的使用场景无关,但我实际上在我的应用程序中做了大量的遗留互操作,因此我可以时不时地求助于使用unsafe代码。但尽管如此,我通常还是会想办法完全避免使用unsafe

而且由于.Net中单个线程的堆栈大小约为1Mb(如果我错了,请纠正我),所以我甚至更加保留不使用stackalloc

有没有一些实际案例中,有人会说:“这正是我不安全地使用stackalloc的正确数量的数据和处理”?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-04-24 10:08:32

使用stackalloc的唯一原因是性能(无论是用于计算还是互操作)。通过使用stackalloc而不是堆分配的数组,您创建的GC压力更小( GC需要运行的更少),您不需要固定数组,分配比堆数组更快,并且它在方法退出时自动释放(仅在GC运行时释放堆分配的数组)。此外,通过使用stackalloc而不是本机分配器(如malloc或.Net等效物),还可以提高速度并在作用域退出时自动释放。

在性能方面,如果您使用stackalloc,由于数据的局部性,您将大大增加缓存命中CPU的机会。

票数 186
EN

Stack Overflow用户

发布于 2009-04-24 10:26:28

我使用stackalloc为接近实时的DSP工作分配缓冲区。这是一个非常特殊的情况,性能需要尽可能保持一致。注意一致性和总体吞吐量之间是有区别的--在这种情况下,我并不担心堆分配太慢,只是关心程序中那个时间点的垃圾收集的不确定性。我不会在99%的情况下使用它。

票数 45
EN

Stack Overflow用户

发布于 2009-04-24 10:03:51

stackalloc只与不安全的代码相关。对于托管代码,您无法决定将数据分配到何处。默认情况下,值类型在堆栈上分配(除非它们是引用类型的一部分,在这种情况下,它们是在堆上分配的)。引用类型在堆上分配。

普通.NET应用程序的默认堆栈大小是1MB,但您可以在PE头中更改此大小。如果你显式启动线程,你也可以通过构造函数重载来设置一个不同的大小。对于ASP.NET应用程序,默认堆栈大小仅为256K,如果您要在两种环境之间切换,请记住这一点。

票数 28
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/785226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档