堆栈上的总变量大小是否有限制?

2024-01-01

在编码时,我们是否应该考虑对堆栈上创建的变量的总大小进行一些限制?如果是,我们应该根据什么来决定?它取决于操作系统、内存可用性等吗?是否有任何编译器选项可以检查这一点?

任何指向该方向的指示也会有所帮助。


这是 C 标准中不太用户友好的领域之一。

这完全取决于实现,并且几乎不可能“正确”地做到这一点。 C 标准不保证您可以在不破坏堆栈的情况下定义哪些自动变量,或者当您这样做时会发生什么,或者任何测量堆栈使用或指定堆栈大小的方法,或者任何检测您即将用完的方法堆栈,也许会产生不可预测的结果。该标准甚至没有提到“堆栈”这个词。

因此,您应该注意您使用的堆栈量,但在嵌入式系统上可能是几千甚至更少,而在桌面系统上可能是 1MB 或更多,多少才算太多。在 Windows 上,您几乎不关心堆栈 - 只要您没有在上面放置大量数组,或者递归到等于某些数组或列表大小的深度,那么您就可以了。在有限的系统上,即使将文件名放在堆栈上也不一定是个好主意。但是,如果您只将内置类型、微小数组和结构放在堆栈上,并且只递归到深度 log N,那么您在任何地方都会很好。希望如果你不舒服的话你会发生明显的崩溃,但你不能确定。

最关键的时候是当你将代码移植到新系统时——如果你无法估计堆栈使用“不是很多”,那么你需要仔细测试。因此,如果您担心有限系统的可移植性,那么您必须谨慎对待堆栈的使用。至于“保守”的含义,这在某种程度上取决于“有限”的含义,但如果您对手机级别的“有限”感兴趣,那么文件名的大小可能就是您可能会想到的“应该”这是在堆上吗?”,但是上下文当然很重要:如果您的文件处理代码有 10 层,在每一层修改文件名,那么您不希望在堆栈上执行此操作。如果它只有几层,并且您知道它不会被堆栈上已经有任何大内容的代码调用,那么您可能可以摆脱它。

虽然我说的是“手机”,但现代智能手机更接近于“哦,用你需要的就可以了”的桌面模式。如果您正在为类似 PIC 的东西进行编程(并坚持编写 C),那么基本上忘记可移植的假设,并准确跟踪您正在使用的堆栈与可用的堆栈进行比较。

我想我不记得曾经遇到过按照 0x6adb015 描述的方式工作的受保护操作系统,所以你甚至不能说“我使用堆栈还是堆并不重要,它们最终都来自同一个池” 。他们不一定。我遇到的两个主要模型是:

  • 堆栈地址空间是预先分配的(可能是已提交的,也可能不是),因此您可以使用的堆栈数量存在硬性限制,超过该限制,即使有剩余内存,您的程序也会崩溃。

  • 堆栈是动态扩展的,因此您可以继续使用堆栈,直到内存耗尽。

因此,堆栈可能是比堆更有限的资源。正如 Mitch Wheat 所说,编译器(或链接器)选项可以改变该区域的大小,请查看手册以了解详细信息。操作系统还可能提供运行时选项,例如ulimit。我想补充一点,线程 API 可以让您指定新线程的堆栈大小。但同样,它完全取决于实现。

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

堆栈上的总变量大小是否有限制? 的相关文章

  • 我的线程图像生成应用程序如何将其数据传输到 GUI?

    Mandelbrot 生成器的缓慢多精度实现 线程化 使用 POSIX 线程 Gtk 图形用户界面 我有点失落了 这是我第一次尝试编写线程程序 我实际上并没有尝试转换它的单线程版本 只是尝试实现基本框架 到目前为止它是如何工作的简要描述 M
  • C#动态支持吗?

    看完之后这个帖子 https stackoverflow com questions 2674906 when should one use dynamic keyword in c sharp 4 0k和链接 我还有 2 个问题 问题 1
  • 为什么我不能用 `= delete;` 声明纯虚函数?

    Intro 纯虚函数使用通用语法声明 virtual f 0 然而 自 c 11 以来 有一种方法可以显式地传达non existence 特殊 成员函数的 Mystruct delete eg default constructor Q
  • 如何在 Android NDK 中创建新的 NativeWindow 而无需 Android 操作系统源代码?

    我想编译一个 Android OpenGL 控制台应用程序 您可以直接从控制台启动 Android x86 运行 或者从 Android x86 GUI 内的 Android 终端应用程序运行 这个帖子 如何在 Android NDK 中创
  • C# 中的接口继承

    我试图解决我在编写应用程序时遇到的相当大的 对我来说 问题 请看这个 为了简单起见 我将尝试缩短代码 我有一个名为的根接口IRepository
  • IronPython:没有名为 json 的模块

    我安装了 IronPython 我的 python 文件如下所示 import sys print sys version import json 运行它的代码 var p Python CreateEngine var scope p C
  • 如何识别 WPF 文本框中的 ValidationError 工具提示位置

    我添加了一个箭头来指示工具提示中的文本框 当文本框远离屏幕边缘时 这非常有效 但是当它靠近屏幕边缘时 工具提示位置发生变化 箭头显示在左侧 Here is the Image Correct as expected since TextBo
  • Qt 创建布局并动态添加小部件到布局

    我正在尝试在 MainWindow 类中动态创建布局 我有四个框架 它们是用网格布局对象放置的 每个框架都包含一个自定义的 ClockWidget 我希望 ClockWidget 对象在调整主窗口大小时相应地调整大小 因此我需要将它们添加到
  • Azure 事件中心 - 按顺序接收事件

    我使用下面的代码从 Azure Event Hub 接收事件 https learn microsoft com en us azure event hubs event hubs dotnet framework getstarted s
  • 无法将类型“System.IO.Stream”隐式转换为“Java.IO.InputStream”

    我提到了一些类似的问题 但没有一个涉及IO 当我使用时 我在java中使用了相同的代码Eclipse 那次就成功了 但现在我尝试在中使用这段代码Mono for Android C 它不起作用 我正在尝试运行此代码来创建一个InputStr
  • C# 中条件编译符号的编译时检查(参见示例)?

    在 C C 中你可以这样做 define IN USE 1 define NOT IN USE 1 define USING system 1 system 1 IN USE 进而 define MY SYSTEM IN USE if US
  • 为什么我不应该对不是由 malloc() 分配的变量调用 free() ?

    我在某处读到 使用它是灾难性的free删除不是通过调用创建的对象malloc 这是真的 为什么 这是未定义的行为 永远不要尝试它 让我们看看当您尝试时会发生什么free 自动变量 堆管理器必须推断出如何获取内存块的所有权 为此 它要么必须使
  • 获取 2 个数据集 c# 中的差异

    我正在编写一个简短的算法 它必须比较两个数据集 以便可以进一步处理两者之间的差异 我尝试通过合并这两个数据集并将结果更改放入新的数据集来实现此目标 我的方法如下所示 private DataSet ComputateDiff DataSet
  • 如何一步步遍历目录树?

    我发现了很多关于遍历目录树的示例 但我需要一些不同的东西 我需要一个带有某种方法的类 每次调用都会从目录返回一个文件 并逐渐遍历目录树 请问我该怎么做 我正在使用函数 FindFirstFile FindNextFile 和 FindClo
  • 将代码拆分为标头/源文件

    我从 Asio 的示例页面中获取了以下代码 class tcp connection public boost enable shared from this
  • 在类的所有方法之前运行一个方法

    在 C 3 或 4 中可以做到这一点吗 也许有一些反思 class Magic RunBeforeAll public void BaseMethod runs BaseMethod before being executed public
  • 双精度类型二维多维数组的 pinvoke 编组作为 c# 和 c++ 之间的输入和输出

    我有以下我正在尝试解决的双物质类型的 2d 多维数组的 c 和 c pinvoke 编组 我已经查看了以下热门内容以获得我目前拥有的内容使用双精度数组进行 P Invoke 在 C 和 C 之间编组数据 https stackoverflo
  • WinRT 定时注销

    我正在开发一个 WinRT 应用程序 要求之一是应用程序应具有 定时注销 功能 这意味着在任何屏幕上 如果应用程序空闲了 10 分钟 应用程序应该注销并导航回主屏幕 显然 执行此操作的强力方法是在每个页面的每个网格上连接指针按下事件 并在触
  • 是否可以在 C# 中强制接口实现为虚拟?

    我今天遇到了一个问题 试图重写尚未声明为虚拟的接口方法的实现 在这种情况下 我无法更改接口或基本实现 而必须尝试其他方法 但我想知道是否有一种方法可以强制类使用虚拟方法实现接口 Example interface IBuilder
  • 匿名结构体作为返回类型

    下面的代码编译得很好VC 19 00 23506 http rextester com GMUP11493 标志 Wall WX Za 与VC 19 10 25109 0 标志 Wall WX Za permissive 这可以在以下位置检

随机推荐

  • Angular2(RC-4):无法读取未定义的属性“pathsWithParams”

    在 angular2 RC 4 中使用子路由时出现此错误 无法读取未定义的属性 pathsWithParams 我的路由文件包含 export const routes RouterConfig path component HomeCom
  • Nodemailer 的邮件在 Azure 服务器上不起作用

    我正在尝试使用 Microsoft azure 上的 Express JS 服务器的 Nodemailer 邮件 api 发送邮件 它在本地计算机上取得成功 但在天蓝色服务器 远程 上却没有成功 任何想法 var mail require
  • CRTP——访问不完整类型成员

    相关问题 one https stackoverflow com questions 6006614 c static polymorphism crtp and using typedefs from derived classes tw
  • 如何在(功能)F# 中创建递归数据结构值?

    type 的值如何 type Tree Node of int Tree list 有一个以函数方式生成的引用自身的值吗 对于 Tree 的合适定义 结果值应等于以下 Python 代码中的 x x Tree x tlist x Edit
  • 将光标移动到 UITextField 的开头

    有没有办法让光标位于a的开头UITextField 当我显示带有内容的控件时 光标放置在文本的末尾 我想把它移到开头 UITextField符合UITextInput协议 它提供了让您控制所选范围的方法 这在我的测试中有效 void tex
  • Python:将 3D 椭球(扁形/长形)拟合到 3D 点

    亲爱的 stackoverflow 用户 我面临如下问题 我想在 python 脚本中将 3D 椭球体拟合到 3D 数据点 起始数据是一组 x y 和 z 坐标 笛卡尔坐标 我想要得到的是 3D 数据点凸包的最佳拟合椭球定义方程中的 a 和
  • AngularFire httpsCallable Object(...) 不是一个函数

    我想在我的 Ionic 3 应用程序中调用 httpsCallable 函数 我正在尝试遵循这些文档 https firebase google com docs functions callable https firebase goog
  • 在 Java 中实现双缓冲

    我有一个简单的 Java JFrame 画布 我每半秒左右更新一次屏幕上的内容 并且有闪烁 我想实现双缓冲来消除闪烁 但我对 Java 相当陌生 不熟悉如何做到这一点 我找到了一些例子 但不确定如何将他们的方法应用到我的方法中 以下是我现在
  • 删除 MS Excel 中特定字符左侧的所有文本

    这是一个与excel相关的问题 我想删除字符串中特定字符或多个字符左侧的所有文本 所有字符 例如 假设我的单元格中有一个字符串大家好 欢迎来到 stackoverflow 现在我想删除 堆栈 左侧的所有字符 意味着结果应该是堆栈溢出 仅限堆
  • WindowsBase.dll 中发生了“System.ComponentModel.Win32Exception”类型的第一次机会异常

    我有一个 NET 4 0 WPF 项目 当我打开文件对话框时 选择一些文件并按 确定 按钮 然后我在输出窗口中看到以下错误 WindowsBase dll 中发生了 System ComponentModel Win32Exception
  • Plotly r,按变量划分的线型

    我正在尝试制作一个散点图 其中线条样式由因子变量指定 就像颜色一样 但我无法让它工作 library plotly df lt data frame x rnorm 20 y rnorm 20 col c rep 1 10 rep 2 10
  • 将补充 Unicode 字符映射到 BMP(如果可能)

    我遇到了这样的问题 我的 XML 解析器 VTD XML 似乎无法处理 Unicode 补充字符 如果我在这里已经错了 请更正 看起来 解析器只使用这些字符的低 16 位 我无法切换到我正在处理的项目中的另一个解析器 我正在解析 Medli
  • 图书馆的异常处理策略

    构建 NET 库时 您的异常处理策略是什么 具体来说 您关于处理库调用内的异常并将其暴露给调用代码的政策是什么 例如 您是否会像对待其他函数一样对待库函数 从而让它无法处理的所有异常按原样流出 您会为该库创建自定义异常吗 您会捕获所有异常并
  • Fixtures、Selenium 和 Rails(天哪?)

    Rails 应用程序上的 Selenium 测试使用哪些数据 你从固定装置加载吗 使用现有的开发数据库 使用单独的 非固定装置 数据库 我正在考虑我的选择 我有一个 Rails 应用程序 其中包含一个大型 Selenium 测试套件 该套件
  • 使用 jqueryhammer.js 2 和事件委托长按(按住)

    我最近升级到hammer js 2 我注意到的第一件事就是 按住 已被 按下 取代 我的旧代码在事件委托方面工作得很好 但切换到按下似乎只有当我将其放在特定元素上时才有效 注意 我通过jquery插件使用hammer js 锤子 js 1
  • 将组件存储在状态中是个好主意吗?

    将整个 React 组件存储在组件状态或 redux 状态中是一个好习惯吗 是的 它是可选的 因为我们可以在状态中存储字符串并有条件地渲染组件 但在某些情况下 将组件存储在状态中更简单 例如 const components useStat
  • 证书中的“主题”是什么意思? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 相关链接是这个MSDN 文章 http msdn microsoft com en us library bfsktky3 VS 80 a
  • getaddrinfo addrinfo 结果在堆栈或堆中

    至少我有点困惑 getaddrinfo 调用 更新 指向 addrinfo 结构的指针 当我要在同一范围 该函数 中使用 addrinfo 时一切都很好 但是如果我将该结构复制到另一个结构 通过分配它 会发生什么 请帮助我了解正在进行的基础
  • 在 mongodb 集群上创建第一个管理员用户时出现错误“无法添加用户:管理员未授权执行命令”

    我在谷歌云计算引擎中使用版本 3 4 的 mongoDB Cluster 实际上上周我的数据库受到了黑客的攻击 这就是为什么我考虑使用授权 这样我就可以避免这些类型的攻击 现在要添加授权我看到了这篇文章如何创建 mongodb 复制集群 h
  • 堆栈上的总变量大小是否有限制?

    在编码时 我们是否应该考虑对堆栈上创建的变量的总大小进行一些限制 如果是 我们应该根据什么来决定 它取决于操作系统 内存可用性等吗 是否有任何编译器选项可以检查这一点 任何指向该方向的指示也会有所帮助 这是 C 标准中不太用户友好的领域之一