C# 中的调用堆栈限制[重复]

2023-12-21

我想知道在出现堆栈溢出异常之前,我们可以在 C# 中的堆栈中执行多少次调用

所以我决定编写以下代码

    static void Method2(int Calls)
    {
        if(!Calls.Equals(0))
            Method1(--Calls);//if more calls remain call method1 and reduce counter
    }
    static void Method1(int Calls)
    {
        if (!Calls.Equals(0))//if more calls remain call method2 and reduce counter
            Method2(--Calls);

    }
    static void Main(string[] args)
    {
        var Calls= 42994;//number of calls(stack overflow appears for large number)
        Method1(Calls);
    }

我的问题是编译器如何决定抛出堆栈溢出异常 这是关于内存限制吗? 一旦我输入 42995,我就得到了 stackoverflow,但是这个数字不是恒定的,那么这是如何工作的呢?


每个线程都有一个堆栈大小。程序主线程的预定义堆栈大小在 exe 文件中是固定的。您进行的每次递归调用都会消耗该堆栈的一小部分。当你完成它时,CLR 会抛出一个StackOverflowException。对于控制台/图形程序,默认堆栈大小应为 1mb 内存。您无法从程序内部使该内存“更大”(您可以使用编辑程序从程序“外部”更改它)。该内存不是动态的。它是固定的(从技术上讲,为该内存保留的地址空间是固定的,内存实际上是由 Windows 操作系统按需分配的,可能一次 4kb,但始终达到保留的地址空间)。您可以使用所需的堆栈大小创建辅助线程。

请注意,以这种方式处理堆栈是 x86/x64 架构的限制,http://en.wikipedia.org/wiki/Stack-based_memory_allocation http://en.wikipedia.org/wiki/Stack-based_memory_allocation:

某些处理器系列(例如 x86)具有用于操作当前执行线程的堆栈的特殊指令。其他处理器系列(包括 PowerPC 和 MIPS)没有显式堆栈支持,而是依赖约定并将堆栈管理委托给操作系统的应用程序二进制接口 (ABI)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 中的调用堆栈限制[重复] 的相关文章

随机推荐

  • facet_grid 中的自由色阶

    假设我有以下数据框 Set seed for RNG set seed 33550336 Create toy data frame loc x lt c a 1 b 2 c 3 loc y lt c a 3 b 2 c 1 scaling
  • Imagemagick - 更改 Heroku 上的 policy.xml

    我正在尝试使用 Imagemagick 在 Heroku 上通过 https 访问图像 如何更改 Heroku 上的策略 在 policy xml 中 Heroku 于 2016 年 5 月进行了 ImageMagick 安全更新 http
  • WordPress 禁用 /admin 重定向到 /wp-admin

    我的网站是用wordpress 4 5 2 对于wordpress控制面板 可以正常登录myweb com wp admin目录 但我有另一个控制面板 目录中有其他应用程序myweb com admin 问题是每当我尝试登录myweb co
  • 通过输入框和 jquery 过滤选择列表

    我想知道是否可以获得一些帮助 通过 jquery 使用输入框过滤选择列表 这是我的 js 的样子 但它似乎不起作用 我猜这是因为选择列表中的选项不可隐藏
  • 我可以直接在表示层中使用域对象吗

    我最初有以下设置 表示层使用 gt 通过 WCF 生成的服务代理 gt 实际服务组件 代理生成于其中 通过 IIS 托管 gt 域层 业务逻辑 gt DAL 最初就是这样 但发现服务和 DAL 也应该访问域层 现在我有一个场景 在表示层中
  • 因为我无法在顶层运行等待,所以我必须将其放入异步函数中 - 为什么我可以直接调用该异步函数?

    我有一个简短的 Node js 脚本 我需要另一个包并从中调用异步函数 然后想要打印返回值 如果我简单地await来自顶层的返回值 然后我会得到一个错误 说我只能使用await在异步函数本身内部 所以显然要走的路是这样的 async fun
  • 在 boost::signals2 中混合使用 boost 智能指针和 C++11 智能指针

    我有一个使用的应用程序boost signals2组件之间进行通信 我试图通过使用它的自动连接管理功能slot type track weak ptr 问题 在我的整个计划中 std shared ptr用来 track期望一个boost
  • Android编程-屏幕分辨率

    我是 Android 编程新手 我见过运行 Android 的不同屏幕分辨率的手机 如何创建一个适用于所有 Android 设备的应用程序 而应用程序视图不会出现任何失真 简短的答案是调整所有布局项目的大小dip dip是缩写Density
  • iOS 增强现实,带有指南针和位置

    我正在尝试开发一个迷你 Around Me 例如使用相机 指南针和位置 我想在屏幕上显示地点的图像 目前我已经有了指南针的位置和方向 我想知道如何确定我要显示的位置的位置 感谢您的帮助 一旦有了相对距离和方位 您就可以使用以下算法从同一坐标
  • 在 PHP 中防止竞争条件的最可靠和安全的方法

    我需要在 PHP 中使用互斥体或信号量 这让我感到害怕 澄清一下 我并不害怕编写正确同步的无死锁代码 也不害怕并发编程的危险 而是害怕 PHP 处理边缘情况的能力 快速背景知识 编写位于用户和第 3 方信用卡网关之间的信用卡处理程序接口 需
  • Flutter 中仅包含数字的 TextFormField

    我正在开发一个需要输入价格的应用程序 因此没有小数位 如果我们使用keyboardType TextInputType numberWithOptions 我们可以获得数字键盘输入 如果我们使用validator input 我们可以检查输
  • Spring Rest 与 Hibernate 的延迟加载

    我正在尝试使用 hibernate 开发 Spring Rest api 在谷歌搜索后 我没有找到延迟加载的解决方案 我有两个如下所示的实体 大学 java Entity Table schema core name university
  • 更新语句-地理列-sql server

    更新 sql server 中的地理列与常规字段 varchar 是否不同 您能否提供一份示例声明来执行此操作 谢谢 我不确定这是否是您正在寻找的答案 但正如我所说 主要区别在于更新 常规字段 时 您通常直接提供新值 例如 UPDATE m
  • Networkx:将多重图转换为具有加权边的简单图

    我有一个多图对象 想将其转换为具有加权边的简单图形对象 我浏览了 networkx 文档 似乎找不到内置函数来实现此目的 我只是想知道是否有人知道 networkx 中的内置函数可以实现这个目标 我查看了 to directed to un
  • BIRT 报告未在 Web 查看器中运行

    我正在 BIRT 设计器中设计报告 当我尝试预览报告或以 html 形式运行时 报告看起来不错 但是 当我尝试在报告查看器 在 IE 或 Firefox 中打开 中运行报告时 它似乎不起作用 请检查所附图片 上面的报告是需要提示 参数 过滤
  • 迭代 df 列并根据行索引、列引用返回数据框中的值

    我的目标是将 年份 列中的每个值与相应的列年份 即 1999 年 2000 年 进行比较 然后我想从相应的列返回相应的值 例如 对于 2004 年阿富汗 第一行 我想查找名为 2004 的列并返回包含阿富汗的行中的值 这是桌子 作为参考 该
  • 如何为轻量级图表设置自定义时区?

    我有一个如下所示的轻量级图表设置 我想添加某种配置 以便图表可以显示本地时间 而不是 Unix 时间戳传递的通用时间 例如 它与我的时间戳有几个小时的偏移 另一种可能性是修改 Unix 时间戳 var chart LightweightCh
  • Rails ActiveRecord:获取原始插入的 id

    sql DmozCategory send sanitize sql array INSERT INTO dmoz categories id dmoz category title dmoz category name dmoz cate
  • Python 将文件拆分为列表

    我在使用下面的功能时遇到问题 它似乎很好地分割了文件 但随后只将其作为一个元素返回 功能 def splitRoute route for line in open route txt r readlines line line repla
  • C# 中的调用堆栈限制[重复]

    这个问题在这里已经有答案了 我想知道在出现堆栈溢出异常之前 我们可以在 C 中的堆栈中执行多少次调用 所以我决定编写以下代码 static void Method2 int Calls if Calls Equals 0 Method1 C