我应该编写一个不会崩溃的程序,并且可以接近免费存储(堆内存)的大小。提示是
Hint: Use a loop to allocate, say, 1000000 bytes at a time and
add 1 to an unsigned long long counter; then when the allocation fails, print
the counter times 1000000.0.
这是我第一次接触编程和c ++,所以我完全迷失了。免费商店的大小是否取决于计算机的内存?我怎么可能以字节为单位计算那个大内存的大小?
还有什么是unsigned long long?
答案 0 :(得分:4)
通过连续分配块直到分配失败来测量RAM当然是一种方法,但并不是专业程序员如何解决问题。这等于通过读取整个文件并逐个计算字节来确定文件的大小(一个应使用stat()
,fstat()
或fseek()
和{{1}而不是)。
更好的方法是向操作系统询问可用的RAM量。毕竟,它肯定知道答案。
在Linux上,您可以使用ftell()
API。请阅读this以获取示例。
在Windows上,您将使用sysinfo()
。阅读它here。
在MacOS上,您可以使用GetPhysicallyInstalledSystemMemory()
API以及sysctl()
和CTL_HW
选择器。
This SO page有三个主要平台的综合示例。
还有一件事:在具有虚拟内存的系统上,您尝试测量的免费存储可能更接近磁盘上系统交换文件的大小,而不是安装的物理RAM的大小,以及其他进程的状态。系统也会影响连续分配所测量的值。
答案 1 :(得分:1)
无符号长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";
答案 2 :(得分:0)
这是一个很好的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 long?
在C ++ 11中,它保证至少为64位。在C ++ 11之前,它是一个无符号整数数据类型,至少与unsigned long
一样大。