【发布时间】:2017-05-14 23:53:45
【问题描述】:
我试图弄清楚在分配失败之前我可以分配多少内存。
这个简单的 C++ 代码分配一个缓冲区(大小为 1024 字节),分配给缓冲区的最后五个字符,报告,然后删除缓冲区。然后它将缓冲区的大小加倍并重复,直到失败。
除非我遗漏了什么,否则代码最多可以在我的 MacBook Pro 上分配 65 TB 的内存。这甚至可能吗?它如何分配比我机器上更多的内存?我一定错过了一些简单的东西。
int main(int argc, char *argv[])
{
long long size=1024;
long cnt=0;
while (true)
{
char *buffer = new char[size];
// Assume the alloc succeeded. We are looking for the failure after all.
// Try to write to the allocated memory, may fail
buffer[size-5] = 'T';
buffer[size-4] = 'e';
buffer[size-3] = 's';
buffer[size-2] = 't';
buffer[size-1] = '\0';
// report
if (cnt<10)
cout << "size[" << cnt << "]: " << (size/1024.) << "Kb ";
else if (cnt<20)
cout << "size[" << cnt << "]: " << (size/1024./1024.) << "Mb ";
else
cout << "size[" << cnt << "]: " << (size/1024./1024./1024.) << "Gi ";
cout << "addr: 0x" << (long)buffer << " ";
cout << "str: " << &buffer[size-5] << "\n";
// cleanup
delete [] buffer;
// double size and continue
size *= 2;
cnt++;
}
return 0;
}
【问题讨论】:
-
是在内存“随机存取内存”还是在“硬盘”上分配变量?
-
顺便说一句:如果你真的想确定你可以分配的实际最大值,你应该在第一次失败后使用一个额外的循环,将添加到分配请求的数量减少两倍每次直到你增加你想要检查的最小值。例如:512GiB请求OK,1024GiB请求失败,则请求(512GiB+256GiB)=768GiB(如果OK则(768GiB+128GiB)=896GiB,如果失败则尝试(512GiB+128GiB)=640GiB)等。
-
macbook pro 与否在这里无关紧要,你不需要把它放在标题中。 Allocating more memory than there exists using malloc, maximum memory which malloc can allocate
-
您可能相信内存就是 RAM 的神话。内存不是 RAM。内存是对存储和检索数据能力的抽象,这种抽象可以用许多不同种类的硬件来实现。 RAM 只是快速方便的解决方案。您最好将内存视为磁盘空间,将 RAM 视为缓存,以便更快地访问磁盘,因为现在就是这样。
标签: c++ memory allocation