【问题标题】:How can you find out the maximum size of the memory stack for a C++ program on linux? (gnu compiler)如何找出 Linux 上 C++ 程序的最大内存堆栈大小? (gnu 编译器)
【发布时间】:2010-10-15 12:14:32
【问题描述】:

我很好奇如何找出特定编译器/操作系统组合的最大堆栈大小。我正在使用 Ubuntu/GNU 编译器。我还有几个问题:

  1. 谁控制默认的最大堆栈大小;操作系统还是编译器?
  2. 默认最大值是否根据总内存进行缩放? (即 2gb 内存的机器比只有 512mb 的机器具有更大的默认大小)对于这个例子,两台机器的操作系统/编译器设置相同,只是系统 RAM 的数量不同。

谢谢!

【问题讨论】:

    标签: c++ memory gnu


    【解决方案1】:

    没有办法以可移植的方式执行此操作 - C++ 标准实际上不需要堆栈。

    【讨论】:

    • 现在我很困惑。我的印象是堆栈是 C++ 内存的重要区域。您能否解释一下 C++ 程序如何在没有堆栈的情况下运行?谢谢。
    • C++ 标准不会给实现带来任何负担。它只讨论分配的存储和免费存储。你会做一个新的从免费存储中取出东西,否则回退到分配的存储中——你会得到漂移。
    • 编译器可以使用调用帧的链接列表,而不是由 CPU 寄存器(也称为堆栈)索引的内存块。我知道的所有实现都使用后者,但 C++ 标准不需要它。
    • 好吧,所以不管实现如何,都没有办法找出 C++ 程序中分配的存储的限制(如果有的话)?
    • 你不能忽视实现——你的具体实现可能会提供一些方法,但该方法可能不会(几乎肯定不会)在另一个实现上起作用。
    【解决方案2】:

    在 Linux (Ubuntu) 上,操作系统控制最大大小。请参阅“man limit”或“man ulimit”以供参考。

    【讨论】:

      【解决方案3】:

      谁控制默认的最大堆栈大小;操作系统还是编译器?

      通常是编译器。操作系统/硬件确实在一定程度上限制了它。 Linux IIRC 上的默认值为 8MB。想想 Linux 上的 ulimit -s(更改堆栈大小)。

      默认最大值是否根据总内存进行缩放? (即 2gb 内存的机器比只有 512mb 的机器具有更大的默认大小)对于这个例子,两台机器的操作系统/编译器设置相同,只是系统 RAM 的数量不同。

      没有。除非你自己做。你可以通过编译器开关改变堆栈大小。

      ld --stack=<STACK_SIZE>
      

      gcc -Wl,--stack=<STACK_SIZE>
      

      C++ 标准对栈和堆问题的看法:

      该标准基于抽象机器,并不真正关心硬件或堆栈或堆。它确实谈到了分配的商店和免费的商店。如果您打电话给新的(大部分),免费商店就是您所在的地方。 FWIW,当涉及到对象分配时,一个实现只能有一个伪装成堆栈和堆的内存区域。

      因此,您的问题归结为特定于实现的问题,而不是语言问题。

      希望这会有所帮助。

      【讨论】:

      • 如果我可以投票给你,我会的。这帮助很大,感谢您的解释。
      • 不用担心投票。乐意效劳。如果您还有其他问题,请告诉我们。
      • 关于 --stack= 的部分答案是完全错误的:这里是 'info ld' 所说的:此选项特定于链接器的 i386 PE 目标端口。在 UNIX 系统上,编译器通常堆栈限制无关。
      • 我不认为我提到它是黄金标准,或者它们适用于所有 Unix 系统。我举了几个例子,读者应该研究一下。
      【解决方案4】:

      如今,正确的问题是:为我的线程分配了多少内存。每个线程获得的内存量通常可以在线程创建时控制。

      要回答第 1 部分,编译器/线程系统可以选择,尽管某些操作系统(历史上)有限制。

      对于 2,不,它没有缩放。

      【讨论】:

        猜你喜欢
        • 2011-01-17
        • 2015-02-13
        • 2010-12-22
        • 2019-07-16
        • 2013-03-22
        • 2011-11-24
        • 2021-08-19
        • 1970-01-01
        相关资源
        最近更新 更多