是否可以确定堆栈上有多少可用空间?

joh*_*ers 11 c++

我正在构建一个小型软件引擎,我想使用堆栈来快速迭代大量集合.但后来我发现这可能是一个坏主意,因为堆栈不像堆那么大的内存存储.但我被堆栈的速度和缺乏动态分配编码实践所吸引.

有没有办法找出我可以在给定平台上推送堆栈的程度?我主要关注移动设备,但问题可能出现在任何平台上.

Nie*_*jes 7

在*nix上,使用getrlimit:

   RLIMIT_STACK
          The maximum size of the process stack, in bytes.  Upon
          reaching this limit, a SIGSEGV signal is generated.  To handle
          this signal, a process must employ an alternate signal stack
          (sigaltstack(2)).
Run Code Online (Sandbox Code Playgroud)

在Windows上,使用VirtualQuery:

对于第一次调用,将其传递给堆栈上任何值的地址,以获取提交的堆栈空间的基址和大小(以字节为单位).在堆栈向下增长的x86机器上,再次从基址和VirtualQuery中减去大小:这将为您提供为堆栈保留的空间大小(假设您当时没有精确地处于堆栈大小的限制).将两者相加可以自然地给出总堆栈大小.

没有与平台无关的方法,因为堆栈大小在逻辑上留给实现和主机系统 - 在嵌入式mini-SOC上,分发的资源比在128GB RAM服务器上少.但是,您可以使用特定于API的调用来影响所有操作系统上特定线程的堆栈大小.


man*_*479 5

可能的便携式解决方案是自己编写分配器.
您不必使用进程堆栈,只需在堆中进行模拟即可.
在开始时分配大量内存,并在其上面写一个堆栈分配器以在分配时使用它.
有关如何在C++中实现它的信息,请参阅Google"分配器要求".

我不确定"Stack Allocator"这个术语是否是规范的,但我的意思是你必须对堆栈的限制放置分配或解除分配的位置.
既然你说你的算法适合这种模式,我认为它很容易.