当我用C写程序时,当我启动一个程序时,我如何判断内存中有多少可用堆栈空间?堆空间怎么样?
我如何知道在我的程序执行过程中使用了多少内存?
发布于 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调用就开始失败。对于“正常”的应用程序,你不必担心会用完虚拟应用程序,但检查失败的分配总是很好的。此外,你不应该得到一个堆栈溢出,除非你有一个错误,或一个糟糕的设计。
发布于 2010-09-25 19:56:48
有一种哲学认为,当你出于实际而不是教育或信息的原因而需要问这些问题时,那么你就做了一些严重错误的事情。
如果你需要检查错误或者确保你的程序有足够的内存,等等。那就别再为这件事发牢骚了,真的。至于你的程序内存,你可以使用任务管理器(在windows上),如果这只是为了调试。如果你需要在你的程序中知道这一点,我不会指望任何非hacky的解决方案。
发布于 2010-09-25 20:00:59
抽象是有原因的真的,你的程序不应该考虑这个问题。这是一个操作系统的问题,你的问题应该是有效的,它需要什么,让操作系统做它的工作。
如果您坚持,您可以查看/proc/meminfo、brk()、getrlimit()和setrlimit() (here are some docs)中的RLIMIT_STACK和RLIMIT_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);
}从here修改,也可以查看系统上的man getrlimit
如果你陈述你想要做什么和为什么要这样做,别人可能会有更好的方法或方式来做你想做的事情。
https://stackoverflow.com/questions/3793660
复制相似问题