【发布时间】:2010-10-15 12:14:32
【问题描述】:
我很好奇如何找出特定编译器/操作系统组合的最大堆栈大小。我正在使用 Ubuntu/GNU 编译器。我还有几个问题:
- 谁控制默认的最大堆栈大小;操作系统还是编译器?
- 默认最大值是否根据总内存进行缩放? (即 2gb 内存的机器比只有 512mb 的机器具有更大的默认大小)对于这个例子,两台机器的操作系统/编译器设置相同,只是系统 RAM 的数量不同。
谢谢!
【问题讨论】:
我很好奇如何找出特定编译器/操作系统组合的最大堆栈大小。我正在使用 Ubuntu/GNU 编译器。我还有几个问题:
谢谢!
【问题讨论】:
没有办法以可移植的方式执行此操作 - C++ 标准实际上不需要堆栈。
【讨论】:
在 Linux (Ubuntu) 上,操作系统控制最大大小。请参阅“man limit”或“man ulimit”以供参考。
【讨论】:
谁控制默认的最大堆栈大小;操作系统还是编译器?
通常是编译器。操作系统/硬件确实在一定程度上限制了它。 Linux IIRC 上的默认值为 8MB。想想 Linux 上的 ulimit -s(更改堆栈大小)。
默认最大值是否根据总内存进行缩放? (即 2gb 内存的机器比只有 512mb 的机器具有更大的默认大小)对于这个例子,两台机器的操作系统/编译器设置相同,只是系统 RAM 的数量不同。
没有。除非你自己做。你可以通过编译器开关改变堆栈大小。
ld --stack=<STACK_SIZE>
或
gcc -Wl,--stack=<STACK_SIZE>
C++ 标准对栈和堆问题的看法:
该标准基于抽象机器,并不真正关心硬件或堆栈或堆。它确实谈到了分配的商店和免费的商店。如果您打电话给新的(大部分),免费商店就是您所在的地方。 FWIW,当涉及到对象分配时,一个实现只能有一个伪装成堆栈和堆的内存区域。
因此,您的问题归结为特定于实现的问题,而不是语言问题。
希望这会有所帮助。
【讨论】:
如今,正确的问题是:为我的线程分配了多少内存。每个线程获得的内存量通常可以在线程创建时控制。
要回答第 1 部分,编译器/线程系统可以选择,尽管某些操作系统(历史上)有限制。
对于 2,不,它没有缩放。
【讨论】: