估计自由存储(堆)大小的c++程序

C++ Program that approximates size of free store (heap)

本文关键字:c++ 程序 自由 存储      更新时间:2023-10-16

我应该写一个程序,不会崩溃,可以近似的大小的自由存储(堆内存)。提示是

提示:使用循环一次分配1000000字节给unsigned long计数器加1;然后,当分配失败时,打印计数器乘以1000000.0.

这是我第一次接触编程和c++,所以我完全不知道从哪里开始。自由存储空间的大小不是取决于计算机的内存吗?我怎么可能用字节来计算那个大内存的大小呢?

unsigned long又是什么?

通过连续分配块直到分配失败来测量RAM当然是一种方法,但这不是专业程序员解决问题的方法。这相当于通过读取整个内容并逐个计算字节来确定文件的大小(应该使用stat(), fstat()fseek()ftell()来代替)。

一个更好的方法是询问操作系统有多少RAM可用。毕竟,它肯定知道这个问题的答案。

在Linux上,您将使用sysinfo() API。请看下面的例子。

在Windows上,您将使用GetPhysicallyInstalledSystemMemory()。点击这里阅读。

在MacOS上,您将使用sysctl() API,以及CTL_HWHW_MEMSIZE选择器。

这个SO页面有三个主要平台的全面示例。

还有一件事:在使用虚拟内存的系统上,您尝试测量的空闲存储空间可能更接近磁盘上的系统交换文件的大小,而不是安装的物理RAM的大小,并且系统上其他进程的状态也会影响通过连续分配测量的值。

unsigned long是64位的整数类型。它可以表示[0,2^64]范围内的任何int。

你的程序不能使用你所有的RAM内存。操作系统限制任何程序可用的内存总量。

源代码:

char *heap;
unsigned long long heap_cont = 1;
while(1)
{
   //allocating the memory. Malloc returns a NULL pointer when fails.
   heap = (char *)malloc(sizeof(char)*heap_cont*1000000);
   if(heap == NULL)
   break;
   free(heap);
   heap_cont++;
}
std::cout << "Heap count: " << heap_cont * 1000000";

这是一个很好的c++问题。解决方案很简单,但需要对循环、内存分配、错误检查、控制台输出和整数数据类型有很好的理解。别难过——如果这真的是你第一次接触编程,那么有人指望你回答这个问题真是太疯狂了。

这个提示给了你所需要的一切。我把它分成几个步骤,你告诉我们哪一部分出了问题。

  • Use a loop
  • allocate, say, 1000000 bytes
  • add 1 to an unsigned long long counter
  • 在不崩溃的情况下找出when the allocation fails
  • print the counter times 1000000.0

自由存储空间的大小不是取决于计算机的内存吗?

是的。它还取决于当前机器上正在运行的其他程序。

我怎么可能用字节来计算那个大内存的大小呢?

计算机必须知道自己内存的大小才能正确运行。在某个地方,信息存在或可以计算。

什么是unsigned long?

在c++ 11中,它保证至少为64位。在c++ 11之前,它是一个至少和unsigned long一样大的无符号整数数据类型。