C++ 如何耗尽记忆?
这可能看起来很傻,但我现在对此有点困惑。为什么这个程序不会消耗所有内存? 例如:我在Linux(2G RAM)终端上运行以下程序C++ 如何耗尽记忆?,c++,memory-management,new-operator,C++,Memory Management,New Operator,这可能看起来很傻,但我现在对此有点困惑。为什么这个程序不会消耗所有内存? 例如:我在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++)
#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;
}
#包括
#包括
使用名称空间std;
int main()
{
cout由于虚拟寻址,您可以分配比实际RAM更多的内存。操作系统将自动调出您不使用的内存(到硬盘)。这样,您的RAM将作为硬盘交换文件的大缓存,它代表系统的实际内存
您的实际限制是指针的地址空间,除非您为64位平台编译(并在其上运行),否则该地址空间为32位。因此您可以分配4GB的空间。您的计算似乎有问题
220=1048576
211=2048
若要分配10亿个整数,请尝试230。请注意,向量
将占用大量空间(至少与正在分配的整数相同)。若要耗尽内存,您根本不需要。您可以调用new int(i)
并丢弃返回的指针,内存仍将被分配
还请记住,您的计算机的虚拟内存可能超过您安装的2 GB物理RAM。2 GB等于20亿字节。这意味着您的RAM可以容纳大约5亿个int指针。现在,您的系统还有一个存储交换文件,它可能与您的RAM一样大或更大
2^20大约是100万。因此,虽然您的程序占用了您的一些内存,但它并没有耗尽所有内存。只要将pow()调用增加到一个可笑的大数字,它就会工作。祝您玩得开心
另外:不能保证sizeof(int)==sizeof(int*),尽管这对许多系统都是正确的。对内存使用存在一些误解
2GB内存机器并不意味着只能使用2GB内存。
(1) 我们有交换空间;(2)Linux过度使用
newint
不占用4字节。
存在内存开销
你不能使用所有的内存。
内存碎片、、文本段等都会占用内存空间
您的程序无法使用其内存执行任何有用的操作。因此,优化器可以将其优化为:
#include <iostream>
int main()
{
std::cout<<sizeof(int*)<<endl;
for(int i=0; i<(1<<10);i++)
{
// nothing
}
return 1;
}
#包括
int main()
{
std::cout64位机器现在比较常见。那么理论上会消耗多少内存。大多数linux发行版现在不是默认启用PAE吗?今天的x86-64实现(CPU)只允许指针使用48位(即使它们的大小为64位;其他24位目前被浪费)。这就是2^48或256 TB。这足够一段时间了。@Martin Beckett:PAE只影响操作系统可以访问的内容;32位应用程序仍然限于32位虚拟地址空间。操作系统可以访问36位,这允许32位操作系统使用64GB的实际RAM。您真正想做的是什么?如果您想测试代码是否在内存中工作内存不足的情况下,那么你真的应该编译新版本的new/delete,在测试过程中的适当时间抛出异常。当然,2^30等会起作用。我想知道基于机器RAM大小的确切数字,有可能吗?你已经更改了问题,这使得我的答案不太有用。但是,你仍然我认为2 GB=2 ^ 11,这显然是错误的几个数量级.Re.Point(1):一个进程只能使用2GB。当你考虑(a)多个进程或(b)一台小于(2GB+OS开销)RAM的机器时,交换空间才是相关的。@ Ruh,x86,Linux有3:1(3GB的VM空间为用户模式,1GB为内核空间)多年来。当然,64位机器上可以有更多。单处理器并不意味着你可以使用所有内存(+os开销),一些内存可以被其他进程mlock
。我错误地理解了这个问题,认为机器有2:2的分割。Doh!