现代计算机的堆栈和堆空间

时间:2010-09-25 11:50:34

标签: c stack memory-management heap

用C语言编写时,如何在启动程序时判断内存中可用的堆栈空间是多少?堆空间怎么样?

如何判断程序执行期间使用了多少内存?

3 个答案:

答案 0 :(得分:2)

有一种哲学认为,当你需要提出这些问题时,出于实际而非教育或信息的原因,那么你就是在做一些严重的错误。

如果您要求进行错误检查或确保您的程序有足够的内存,请等等......请不要对此感到担忧,请认真对待。至于您的程序内存,如果只是用于调试,您可以使用任务管理器(在Windows上)。如果你需要在你的程序中知道这一点,我不会指望任何非hacky解决方案。

答案 1 :(得分:2)

这是所有特定于Win32的(不是特定于C的,都是OS API):

创建一个线程时,默认情况下它会获得1MB的堆栈空间,可以在你使用的任何CreateThread API中进行修改。

您可以查看线程信息块以查找实际的堆栈信息,但即使记录了这一点,也不会正式支持此技术,请参阅http://en.wikipedia.org/wiki/Win32_Thread_Information_Block

此外,对于32位应用程序,您最多只能处理2GB,因此对于按设计使用大量内存的应用程序,需要注意的是进程的虚拟地址空间的总大小(已提交+保留),包括所有堆分配。您可以使用GlobalMemoryStatusEx API以编程方式访问进程的虚拟内存,查看虚拟地址空间的ullTotalVirtual参数。一旦您的进程接近1.8或1.9GB的VAS,那么堆分配和VirtualAlloc调用开始失败。对于“普通”应用程序,您不必担心耗尽VAS,但检查失败分配总是好的。此外,除非您有错误或设计错误,否则不应该出现堆栈溢出。

答案 2 :(得分:1)

抽象原因 实际上,您的程序不应该将此作为一个问题。这是一个操作系统问题,你的问题应该只是有效率,并让操作系统完成它的工作。

如果您坚持,可以使用/proc/meminfo和{brk()来查看getrlimit()setrlimit()RLIMIT_STACKRLIMIT_DATAhere are some docs) {1}}近似值和粗糙值的值。

#include <sys/resource.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main (int argc, char *argv[])
{
  struct rlimit limit;

  /* Get the stack limit. */
  if (getrlimit(RLIMIT_STACK, &limit) != 0) {
    printf("getrlimit() failed with errno=%d\n", errno);
    exit(1);
  }

  printf("The stack soft limit is %llu\n", limit.rlim_cur);
  printf("The stack hard limit is %llu\n", limit.rlim_max);
  exit(0);
}

here修改,另请参阅系统上的man getrlimit

如果您说明 ,那么有人可能会采用更好的方法或方法来做您想做的事。