【问题标题】:Is it ok to allocate lots of memory on stack in single threaded applications?在单线程应用程序中可以在堆栈上分配大量内存吗?
【发布时间】:2016-03-02 05:57:04
【问题描述】:

我了解,如果您有一个多线程应用程序,并且需要分配大量内存,那么您应该在堆上分配。堆栈空间在应用程序的线程之间分配,因此每个线程的堆栈大小随着您创建新线程而变小。因此,如果您尝试在堆栈上分配大量内存,它可能会溢出。但是,假设您有一个单线程应用程序,堆栈大小是否与堆大小基本相同?

我在别处读到堆栈和堆在地址空间中没有明确定义的边界,而是它们相互增长。

附:被分配对象的生命周期不是问题。对象首先在程序中创建,并在退出时被清理。我不必担心它会超出范围,从而从堆栈空间中清除。

【问题讨论】:

  • 这一切都取决于您在哪个系统上运行。不同的系统做不同的事情。最好在您的问题中说明您要问的是哪个系统。
  • 尝试在栈和堆上分配20mb,看看会发生什么。
  • @M.M 我实际上正在应对编码挑战。所以,我猜这个系统是未知的。
  • “因此,当您创建新线程时,每个线程的堆栈大小会变小” – 嗯,不……?!

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


【解决方案1】:

不,堆栈大小与堆不同。堆栈对象以 LIFO 方式推送/弹出,并用于诸如程序流之类的事情。例如,参数在函数调用之前被“推入”堆栈,然后“弹出”到要访问的函数参数中。因此,如果你走得太深,递归会使用大量的堆栈空间。堆实际上是用于指针和分配的内存。在现实世界中,堆栈就像你时钟上的齿轮,而堆就像你的办公桌。您的时钟放在办公桌上,因为它占用空间 - 但您将其用于与办公桌完全不同的东西。

在 Stack Overflow 上查看这个问题:

Why is memory split up into stack and heap?'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    • 2013-10-18
    • 2017-12-11
    • 1970-01-01
    • 2017-05-16
    • 2014-07-05
    • 2014-10-11
    相关资源
    最近更新 更多