2

用 C 语言编写时,我如何知道启动程序时内存中有多少可用的堆栈空间?堆空间呢?

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

4

3 回答 3

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 用完,但检查失败分配总是好的。此外,除非您有错误或糟糕的设计,否则您不应该出现堆栈溢出。

于 2010-09-25T13:50:37.460 回答
2

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

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

于 2010-09-25T11:56:48.140 回答
1

抽象是有原因的 真的,你的程序不应该有这个问题。这是操作系统的问题,您的问题应该只是有效地满足它的需要,并让操作系统完成它的工作。

如果您坚持,您可以查看/proc/meminfobrk()和(这里有一些文档getrlimit()以及近似值和粗略的值。setrlimit()RLIMIT_STACKRLIMIT_DATA

#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);
}

这里修改还可以man getrlimit在您的系统上查看

如果你说明你想做什么以及为什么要这样做,那么有人可能有更好的方法或方式来做你想做的事。

于 2010-09-25T12:00:58.597 回答