2

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

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

谢谢!

4

4 回答 4

8

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

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

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

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

ld --stack=<STACK_SIZE>

或者

gcc -Wl,--stack=<STACK_SIZE>

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

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

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

希望这可以帮助。

于 2009-03-25T16:54:30.560 回答
3

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

于 2009-03-25T16:53:55.677 回答
2

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

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

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

于 2009-03-25T16:54:40.277 回答
0

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

于 2009-03-25T16:53:45.803 回答