估计自由存储(堆)大小的c++程序
C++ Program that approximates size of free store (heap)
我应该写一个程序,不会崩溃,可以近似的大小的自由存储(堆内存)。提示是
提示:使用循环一次分配1000000字节给unsigned long计数器加1;然后,当分配失败时,打印计数器乘以1000000.0.
这是我第一次接触编程和c++,所以我完全不知道从哪里开始。自由存储空间的大小不是取决于计算机的内存吗?我怎么可能用字节来计算那个大内存的大小呢?
unsigned long又是什么?
通过连续分配块直到分配失败来测量RAM当然是一种方法,但这不是专业程序员解决问题的方法。这相当于通过读取整个内容并逐个计算字节来确定文件的大小(应该使用stat()
, fstat()
或fseek()
和ftell()
来代替)。
一个更好的方法是询问操作系统有多少RAM可用。毕竟,它肯定知道这个问题的答案。
在Linux上,您将使用sysinfo()
API。请看下面的例子。
在Windows上,您将使用GetPhysicallyInstalledSystemMemory()
。点击这里阅读。
在MacOS上,您将使用sysctl()
API,以及CTL_HW
和HW_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
一样大的无符号整数数据类型。
- Mongodb c++驱动程序:如何查询元素的数组
- C++,系统无法执行指定的程序
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 重载操作程序时出错>>用于类中的字符串 memebr
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 试图在visual studio上用C++创建一个桌面应用程序
- 模板元程序查找相似的连续类型名称
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 如何通过cpp程序运行shell脚本
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- IPC使用多个管道和分支进程来运行Python程序
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 基于boost的程序的静态链接——zlib问题
- 程序崩溃并显示"std::out_of_range"错误
- 在C应用程序中运行C++(带有STL)函数
- 使用mongocxx驱动程序时包含头文件问题
- 如何在c++程序中找到函数的地址