代码之家  ›  专栏  ›  技术社区  ›  kal

Linux 32位计算机上程序的堆栈分配限制

  •  1
  • kal  · 技术社区  · 15 年前

    在C++中,堆栈段在编译器放弃之前会增长多少,并且说它不能为堆栈分配更多的内存。

    在linux(fedora)32位机器上使用gcc。

    3 回复  |  直到 15 年前
        1
  •  10
  •   Alexandru    15 年前

    在UNIX下,如果您正在运行bash,请运行

    $ ulimit -a
    

    它将列出各种限制,包括堆栈大小。我的是8192kb。您可以使用ulimit更改限制。

    $ man 3 ulimit
    

    在窗口下,请参见 StackReserveSize StackCommitSize

    实际上,堆栈地址从高地址开始(在32位平台上,接近3GB限制),并在内存分配从低地址开始时减少。这允许堆栈和内存增长,直到整个内存耗尽。

        2
  •  2
  •   Tom    15 年前

    在我的32位linux上,是8192K字节。所以 在你的机器上也一样。

    $ uname -a
    Linux TomsterInc 2.6.28-14-generic #46-Ubuntu SMP Wed Jul 8 07:21:34 UTC 2009 i686 GNU/Linux
    $ ulimit -s
    8192
    
        3
  •  1
  •   Ira Baxter    15 年前

    Windows(我认为Linux)都是在计算机上运行的 大堆栈模型 假设,也就是说,有一个堆栈(每个线程),其空间在线程启动之前被预先分配。

    由于操作系统通常将堆栈放置在远离其他结构的地方,因此当到达ulimit时,如果发生溢出时堆栈旁边没有显示任何其他内容,则操作系统可能能够扩展堆栈。一般来说,如果您正在构建一个复杂到足以使堆栈溢出的程序,那么很可能是在动态分配内存,并且堆栈旁边的区域没有得到分配。如果分配了这样的内存,那么操作系统当然无法在其所在的位置扩展堆栈。

    这意味着应用程序不能指望操作系统自动扩展堆栈。实际上,堆栈 成长。

    从理论上讲,耗尽堆栈的应用程序可能能够启动具有更大堆栈的新线程,复制现有堆栈并继续,但实际上我怀疑这是否可以做到,若并没有其他原因,指向局部变量的指针堆栈将需要调整,C/C++编译器无法找到此类指针并进行调整。

    我们有一种称为PARLANSE的并行编程语言,它进行堆分配,以使数千个并行计算粒度(实际上)能够以这种方式任意递归。