C# 在避免stackoverflow异常的同时使用stackalloc的任何方法

C# 在避免stackoverflow异常的同时使用stackalloc的任何方法,c#,asp.net,.net,asp.net-core,.net-core,C#,Asp.net,.net,Asp.net Core,.net Core,在C#NET中,为了避免堆分配,stackalloc关键字非常吸引人。但是,我担心使用stackalloc可能会导致stackoverflow异常。为了避免异常,在避免异常的同时使用stackoverflow是否有好的方法?我最初提出了以下代码,但我没有弄清楚如何获得剩余的堆栈大小 void Main() { var remainingStackSize = //Get remaining stacksize somehow. var arraySize = 100;

在C#NET中,为了避免堆分配,
stackalloc
关键字非常吸引人。但是,我担心使用
stackalloc
可能会导致
stackoverflow
异常。为了避免异常,在避免异常的同时使用
stackoverflow
是否有好的方法?我最初提出了以下代码,但我没有弄清楚如何获得剩余的堆栈大小

void Main()
{
    var remainingStackSize = //Get remaining stacksize somehow.

    var arraySize = 100;
    if (remainingStackSize > sizeof(byte) * arraySize) 
    {
        Span<byte> numbers = stackalloc byte[arraySize];
    }
    else 
    {
        Span<byte> numbers = new byte[arraySize];
    }
}
void Main()
{
var remainingStackSize=//以某种方式获取剩余的stacksize。
var arraySize=100;
if(remainingStackSize>sizeof(字节)*arraySize)
{
Span numbers=stackalloc字节[arraySize];
}
其他的
{
跨度编号=新字节[arraySize];
}
}
来自:

堆栈上可用的内存量是有限的。如果在堆栈上分配太多内存,将抛出StackOverflowException。要避免这种情况,请遵循以下规则:

限制使用stackalloc分配的内存量。因为堆栈上可用的内存量取决于代码执行的环境,所以在定义实际限制值时要保守

避免在循环内部使用stackalloc。在循环外部分配内存块,并在循环内部重用它


另请参见

无法在.NET中检索最大堆栈大小、起始堆栈地址和当前堆栈地址。您可以编写并编译一个C函数,从SP/RSP寄存器中提取堆栈指针,然后使用已知的最大堆栈大小启动一个新线程。从这里开始,在
Main()
的开头,您可以检索堆栈指针,将其存储到某个全局静态字段,然后在需要测量当前堆栈位置时再次检索它。减去指针,然后从已知的最大堆栈大小中减去。(我还没有试过这个。)