如何找出 Linux 上 C++ 程序的内存堆栈的最大大小?(gnu 编译器)
题
我很好奇如何找出特定编译器/操作系统组合的最大堆栈大小。我正在使用 Ubuntu/GNU 编译器。我另外还有几个问题是:
- 谁控制默认的最大堆栈大小;操作系统还是编译器?
- 默认最大值是根据总内存缩放的吗?(即具有 2GB 内存的机器的默认大小会比只有 512MB 的机器的默认大小更大)对于此示例,两台机器具有相同的操作系统/编译器设置,只是系统 RAM 量不同。
谢谢!
解决方案
谁控制默认的最大堆栈大小;操作系统还是编译器?
通常是编译器。操作系统/硬件确实在一定程度上限制了它。Linux IIRC 上的默认值为 8MB。考虑到 ulimit -s
在 Linux 上(更改堆栈大小)。
默认最大值是根据总内存缩放的吗?(即具有 2GB 内存的机器的默认大小会比只有 512MB 的机器的默认大小更大)对于此示例,两台机器具有相同的操作系统/编译器设置,只是系统 RAM 量不同。
不。直到并且除非您自己这样做。您可以通过编译器开关更改堆栈大小。
ld --stack=<STACK_SIZE>
或者
gcc -Wl,--stack=<STACK_SIZE>
C++ 标准对栈和堆问题的看法:
该标准基于抽象机器,并不真正关心硬件、堆栈或堆。它确实讨论了分配存储和空闲存储。如果您(大多数情况下)打电话给新人,您就会去免费商店。FWIW,在对象分配时,一种实现只能有一个伪装成堆栈和堆的内存区域。
因此,您的问题归根结底是一个特定于实现的问题,而不是语言问题。
希望这可以帮助。
其他提示
在 Linux (Ubuntu) 上,操作系统控制最大大小。请参阅“man limit”或“man ulimit”以供参考。
现在,正确的问题是:分配了多少内存 到我的线程。 每个线程都会获得一个数量,通常您可以在线程创建时控制该数量。
为了回答第 1 部分,编译器/线程系统可以选择,尽管某些操作系统(历史上)有限制。
对于 2,不,它没有缩放。
没有办法可移植地执行此操作 - C++ 标准实际上并不需要堆栈。
不隶属于 StackOverflow