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

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

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

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

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

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

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

如果你坚持,你可以查看/proc/meminfobrk()getrlimit()setrlimit() ( 这里是一些文档 ), RLIMIT_STACKRLIMIT_DATA值用于近似和粗糙。

 #include  #include  #include  #include  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

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