我需要为我正在编写的程序接收并处理非常大的图像缓冲区,所以我运行了一些快速测试,以查看我可以用于程序的最大堆存储量。
运行以下代码不会产生任何错误。
uint64_t sz = 1; sz <<= 30;
uint8_t *test = new uint8_t[sz];
std::cout << "size is " << sz << " bytes.\n";
delete[] test;
但是,如果我将shift sz减去31而不是30,或者如果我创建两个具有上述大小的测试数组,我会收到一个std :: bad_alloc异常。
这似乎表明我可以使用最大约1GB的堆空间,尽管64位系统具有8GB的RAM。是否有一个原因?这是一个可变的价值吗?正如我的标签所示,我正在运行Windows并使用Visual Studio。理想情况下,我希望尽可能多地将缓冲区加载到RAM中,而不会产生交换。
(顺便说一句,在运行Yosemite的Mac上,我不仅可以分配这么多的堆存储空间,而且甚至可以以很短的增量写入它,以强制它全部实际被分配(不仅仅是被malloc放在一边)并随后从中读取。活动监视器报告程序使用的1,2,4,8,16 ...... GB RAM,尽管绝大多数都是压缩的。)