C# 是否需要在.NET中显式调整堆栈大小?

C# 是否需要在.NET中显式调整堆栈大小?,c#,.net,memory,stack,C#,.net,Memory,Stack,我在.NET中使用大量数组,其中结构类型远远大于为堆栈分配的标准1MB(每个线程)。我现在只关心主线 我读过一篇老文章(可能已经过时),其中明确提到调整堆栈大小: 我注意到,我的程序在32位模式下,而不是在64位模式(我感兴趣的主要模式)下,经常会因堆栈溢出异常而崩溃 试探性假设 在32位模式下,需要显式增加堆栈的大小 NET framework在64位模式下为您隐式调整堆栈大小(即使此行为与64位模式不一致) C#和VB.NET编译器无法指定主线程的初始堆栈大小。C++/CLI编译器会执行此操

我在.NET中使用大量
数组
,其中
结构
类型远远大于为堆栈分配的标准1MB(每个线程)。我现在只关心主线

  • 我读过一篇老文章(可能已经过时),其中明确提到调整堆栈大小:

  • 我注意到,我的程序在32位模式下,而不是在64位模式(我感兴趣的主要模式)下,经常会因堆栈溢出异常而崩溃

  • 试探性假设
  • 在32位模式下,需要显式增加堆栈的大小

  • NET framework在64位模式下为您隐式调整堆栈大小(即使此行为与64位模式不一致)

  • C#和VB.NET编译器无法指定主线程的初始堆栈大小。C++/CLI编译器会执行此操作。在中使用Editbin.exe是一种简单的解决方法

    此选项未公开,因为默认堆栈大小对于托管代码来说非常大。与C和C++等非托管语言不同,使用声明来消耗大量堆栈没有简单的方法。数组和字符串是引用类型,因此在GC堆而不是堆栈上分配

    唯一体面的方法是使用不安全的
    stackalloc
    关键字,这是一个你永远不会偶然使用的关键字。或者通过递归,或者是偶然的(目前最常见的情况),或者是使用比O(logN)更糟糕的递归算法。这样的问题严重地倾向于bug,Editbin.exe只是一个创可贴,因为当数据集足够大时,你仍然会吹栈。 唯一值得注意的其他细节是,如果专门针对x64,初始堆栈大小将为4MB,而不是1MB。通常也是一个错误,你总是喜欢任何CPU



    因此,否则盲目的建议是开始寻找递归代码。它不应该离生成SOE的语句太远,至少在堆栈跟踪中是可见的。注意O(N)尾草书,你不能指望它得到优化,绝对不能在32位代码中。考虑将其替换或分区,或将检查添加到数据集大小,并先例抛出异常。

    in .NET,数组是引用类型,它们位于堆上。堆栈溢出错误是由您的代码引起的,因此您应该发布一些。检查此项,希望这有助于我认为值得详细说明尾部调用优化,这是x86和x64 JIT行为之间的一个显著差异,它对抛出StackOverflowException的倾向的影响比线程堆栈大小大得多。