这可能看起来很傻,但我现在对此有点困惑。为什么这个程序不会消耗所有的内存?例如:我在Linux(2G RAM)终端上运行以下程序,
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
cout<<sizeof(int*)<<endl;
for(int i=0; i<pow(2.0,30.0);i++)
{
new int(i);
}
return 1;
}1)我确认了这台机器的int大小是4字节,那么对于2 2GB的内存,它只能容纳2^30/2^2=2^28
2)按照上面的逻辑,你怎么能改变程序,实际上消耗了所有2 2GB的内存?
补充:我只想确保我在理论上正确理解它。如果没有虚拟内存或操作系统优化等,2GBRAM只能容纳2^28int,对吗?在这种情况下,上面的程序会消耗所有内存吗?你知道我如何关闭虚拟内存/交换内存等功能吗?在linux上?
谢谢!
发布于 2011-07-07 12:14:55
由于有了虚拟寻址,就RAM而言,您可以分配比实际拥有更多的内存。操作系统会自动调出您不使用的内存(到硬盘)。通过这种方式,您的RAM充当硬盘交换文件的大型缓存,该文件代表系统的实际内存。
您的实际限制是指针的地址空间,除非您正在为64位平台编译(并在其上运行),否则指针的地址空间是32位。所以你可以分配4 4GB的空间。
发布于 2011-07-07 16:16:57
你的程序不会用它的内存做任何有用的事情。因此,优化器可以将其优化为:
#include <iostream>
int main()
{
std::cout<<sizeof(int*)<<endl;
for(int i=0; i<(1<<10);i++)
{
// nothing
}
return 1;
}发布于 2011-07-07 12:24:04
2 GB相当于20亿字节。这意味着你的RAM可以容纳大约5亿个int指针。现在,您的系统也有一个交换文件用于存储,其大小可能与您的RAM一样大,甚至更大。
2^20大约是一百万。因此,当你的程序消耗了你的一些内存时,它并不会用完所有的内存。只需将pow()调用增加到一个大得离谱数字,它就会起作用。玩得开心!
此外:不能保证sizeof(int) == sizeof(int*),尽管这在许多系统中都是正确的。
https://stackoverflow.com/questions/6605706
复制相似问题