Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用c语言的程序检查堆栈内存的大小#_C#_Memory_Stack_Limit_Stack Overflow - Fatal编程技术网

C# 如何使用c语言的程序检查堆栈内存的大小#

C# 如何使用c语言的程序检查堆栈内存的大小#,c#,memory,stack,limit,stack-overflow,C#,Memory,Stack,Limit,Stack Overflow,我尝试了很多方法,但是有很多方法可以找到堆栈溢出发生的时间,但是没有一个程序可以确定堆栈的实际限制你是对的;确实没有一个好的方法来确定这一点。但是:如果您使用了足够多的堆栈来处理它,那么可能已经出现了很大的问题 有两种常见的情况涉及堆栈溢出: 递归,通常可以由非递归循环代替,有时涉及堆栈或队列作为占位符(假设它不是无缘无故的错误无限递归-非常常见的错误) 过大的局部变量,特别是对非平凡有效载荷过度使用stackalloc(后者通常可以在检查非平凡有效载荷大小后,用ArrayPool租约替换)

我尝试了很多方法,但是有很多方法可以找到堆栈溢出发生的时间,但是没有一个程序可以确定堆栈的实际限制

你是对的;确实没有一个好的方法来确定这一点。但是:如果您使用了足够多的堆栈来处理它,那么可能已经出现了很大的问题

有两种常见的情况涉及堆栈溢出:

  • 递归,通常可以由非递归循环代替,有时涉及
    堆栈
    队列
    作为占位符(假设它不是无缘无故的错误无限递归-非常常见的错误)
  • 过大的局部变量,特别是对非平凡有效载荷过度使用
    stackalloc
    (后者通常可以在检查非平凡有效载荷大小后,用
    ArrayPool
    租约替换)
关于后者,有人讨论了一个概念上的API“给我一个某种跨度,但让运行时根据堆栈中剩余空间的大小和数量来决定是使用stackalloc还是租约或独立数组”,但是:到目前为止还没有实现

此外,请注意,使用大量堆栈空间可能比您想象的更昂贵;虽然可能会分配一个大堆栈,但这是虚拟内存,在第一次使用之前不一定需要实际内存;所以:计划使用大量的堆栈空间可能会强制堆栈区域的实际内存分配,这样就永远无法回收

因此,再一次总结一下:不,这并不是一个很好的方法,但是如果您想要它,您可能做了一些错误的事情。

在Visual Studio中,哪里有一个“调用堆栈”窗口。如果遇到断点,可以随时检查调用顺序。