首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何耗尽内存?

如何耗尽内存?
EN

Stack Overflow用户
提问于 2011-07-07 12:10:21
回答 4查看 2.2K关注 0票数 4

这可能看起来很傻,但我现在对此有点困惑。为什么这个程序不会消耗所有的内存?例如:我在Linux(2G RAM)终端上运行以下程序,

代码语言:javascript
复制
  #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上?

谢谢!

EN

回答 4

Stack Overflow用户

发布于 2011-07-07 12:14:55

由于有了虚拟寻址,就RAM而言,您可以分配比实际拥有更多的内存。操作系统会自动调出您不使用的内存(到硬盘)。通过这种方式,您的RAM充当硬盘交换文件的大型缓存,该文件代表系统的实际内存。

您的实际限制是指针的地址空间,除非您正在为64位平台编译(并在其上运行),否则指针的地址空间是32位。所以你可以分配4 4GB的空间。

票数 7
EN

Stack Overflow用户

发布于 2011-07-07 16:16:57

你的程序不会用它的内存做任何有用的事情。因此,优化器可以将其优化为:

代码语言:javascript
复制
  #include <iostream>

  int main()
  {
     std::cout<<sizeof(int*)<<endl;
     for(int i=0; i<(1<<10);i++)
       {
         // nothing
       }
    return 1;
  }
票数 1
EN

Stack Overflow用户

发布于 2011-07-07 12:24:04

2 GB相当于20亿字节。这意味着你的RAM可以容纳大约5亿个int指针。现在,您的系统也有一个交换文件用于存储,其大小可能与您的RAM一样大,甚至更大。

2^20大约是一百万。因此,当你的程序消耗了你的一些内存时,它并不会用完所有的内存。只需将pow()调用增加到一个大得离谱数字,它就会起作用。玩得开心!

此外:不能保证sizeof(int) == sizeof(int*),尽管这在许多系统中都是正确的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6605706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档