用 C 语言编写时,我如何知道启动程序时内存中有多少可用的堆栈空间?堆空间呢?
如何判断程序执行期间使用了多少内存?
用 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/meminfo
、brk()
和(这里有一些文档)getrlimit()
以及近似值和粗略的值。setrlimit()
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);
}
从这里修改还可以man getrlimit
在您的系统上查看
如果你说明你想做什么以及为什么要这样做,那么有人可能有更好的方法或方式来做你想做的事。