如何找出 Linux 上 C++ 程序的内存堆栈的最大大小?(gnu 编译器)

StackOverflow https://stackoverflow.com/questions/682444

  •  22-08-2019
  •  | 
  •  

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

  1. 谁控制默认的最大堆栈大小;操作系统还是编译器?
  2. 默认最大值是根据总内存缩放的吗?(即具有 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++ 标准实际上并不需要堆栈。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top