【问题标题】:Using whole stack memory使用整个堆栈内存
【发布时间】:2021-09-22 13:30:52
【问题描述】:

您好,我听说在 c++ 中堆栈内存被用于“普通”变量。如何使堆栈满?我尝试使用大量数组,但没有帮助。堆栈有多大,位于何处?

【问题讨论】:

  • 只需在main 中声明一个大于典型堆栈大小 1MB 的大型 c 数组。如果您有问题,请在此处发布您的代码。请阅读How to Askminimal reproducible example
  • 别忘了说明你要解决的真正问题是什么。
  • @RichardCritten 您更有可能使用大数组而不是堆栈本身来破坏堆栈帧。微妙不同的问题(结果可能相同)。一个中等大小的对象和一点递归将很快炸毁堆栈。

标签: c++ heap-memory stack-memory


【解决方案1】:

您好,我听说在 c++ 中堆栈内存用于“普通”变量。

在函数或 main 中声明的局部(自动)变量主要在堆栈(或寄存器)上分配内存,并在执行完成时释放。

如何使堆栈满?我尝试使用大量数组,但没有帮助。

使用大量数组、许多递归调用、传递包含大量数组的大型结构的参数都是方法。另一种方法也可能是减少堆栈大小:-Wl,--stack,number (for gcc)

堆栈有多大,它在哪里?

这取决于平台、操作系统等。标准不确定任何堆栈大小。它的位置在程序启动之前由操作系统确定。操作系统从虚拟内存中为堆栈分配内存。

【讨论】:

    【解决方案2】:

    C++ 语言没有指定诸如“堆栈”之类的东西。这是一个实现细节,因此除非我们在讨论 C++ 的特定实现,否则深思熟虑是没有意义的。

    但是是的,在典型的 C++ 实现中,自动变量存储在执行堆栈中。

    如何让栈满?

    第 1 步:使用堆栈大小有限的语言实现。这很常见。

    第 2 步:创建一个超出限制的自动变量。或者嵌套太多非尾递归函数调用。如果运气好,程序可能会崩溃。

    您不希望堆栈在生产使用中耗尽。

    堆栈有多大

    取决于语言实现。它甚至可以是可配置的。在普通桌面/服务器系统上,默认值为 1 到几兆字节。嵌入式系统的内容较少。

    它位于哪里?

    在内存中选择语言实现的地方。


    最重要的是,可用于自动变量的内存通常是有限的。因此:

    • 不要使用大的自动变量。
    • 当深度的渐近增长为线性或更差时,请勿使用递归。
    • 不要让用户输入无限制地影响自动变量的数量或大小或递归深度。

    【讨论】:

    • The C++ language doesn't specify such thing as "stack". - 在技术上不正确。见en.cppreference.com/w/cpp/container/stack ;)
    • 在不那么开玩笑的情况下,处理堆栈的通常不是 C++ 实现。通常是操作系统。
    • @SergeyA (☞゚ヮ゚)☞
    • @SergeyA 我将操作系统视为整个语言实现协议的一部分。
    • 我不太了解微笑的现代含义,(真的!),所以我无法欣赏您的评论。至于区分操作系统与语言实现,我觉得它很有用。但我并没有强迫我的意见。
    猜你喜欢
    • 2014-10-13
    • 2017-12-21
    • 2011-08-15
    • 1970-01-01
    • 2017-02-08
    • 2012-06-03
    • 1970-01-01
    • 2011-11-08
    • 2011-10-21
    相关资源
    最近更新 更多