首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >现代计算机的堆栈和堆空间

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

Stack Overflow用户
提问于 2010-09-25 19:50:34
回答 3查看 1.1K关注 0票数 2

当我用C写程序时,当我启动一个程序时,我如何判断内存中有多少可用堆栈空间?堆空间怎么样?

我如何知道在我的程序执行过程中使用了多少内存?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-09-25 21:50:37

这都是Win32特定的(不是真正的C特定的,都是OS API):

创建线程时,它默认获得1MB的堆栈空间,可以在您使用的任何CreateThread应用程序接口中对其进行修改。

您可以查看线程信息块以找到实际的堆栈信息,但即使有文档记录,此技术仍未得到官方支持,请参阅http://en.wikipedia.org/wiki/Win32_Thread_Information_Block。

此外,对于32位应用程序,最多只能寻址2 2GB,因此对于设计使用大量内存的应用程序,需要注意的是进程的虚拟地址空间(已提交+保留)的总大小,其中包括所有堆分配。您可以使用GlobalMemoryStatusEx API以编程方式访问进程的虚拟内存,请查看虚拟地址空间的ullTotalVirtual参数。一旦您的进程接近1.8或1.9 or的VAS,堆分配和VirtualAlloc调用就开始失败。对于“正常”的应用程序,你不必担心会用完虚拟应用程序,但检查失败的分配总是很好的。此外,你不应该得到一个堆栈溢出,除非你有一个错误,或一个糟糕的设计。

票数 2
EN

Stack Overflow用户

发布于 2010-09-25 19:56:48

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

如果你需要检查错误或者确保你的程序有足够的内存,等等。那就别再为这件事发牢骚了,真的。至于你的程序内存,你可以使用任务管理器(在windows上),如果这只是为了调试。如果你需要在你的程序中知道这一点,我不会指望任何非hacky的解决方案。

票数 2
EN

Stack Overflow用户

发布于 2010-09-25 20:00:59

抽象是有原因的真的,你的程序不应该考虑这个问题。这是一个操作系统的问题,你的问题应该是有效的,它需要什么,让操作系统做它的工作。

如果您坚持,您可以查看/proc/meminfo、brk()、getrlimit()和setrlimit() (here are some docs)中的RLIMIT_STACK和RLIMIT_DATA值来进行近似和粗略处理。

代码语言:javascript
复制
#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

如果你陈述你想要做什么和为什么要这样做,别人可能会有更好的方法或方式来做你想做的事情。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3793660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档