为什么我不能在我的矢量中保留1,000,000,000?

时间:2010-05-09 08:00:40

标签: c++ file memory vector

当我输入foll时。代码,我得到输出为1073741823。

#include <iostream>
#include <vector>
using namespace std;
int main()
{
  vector <int> v;
  cout<<v.max_size();
  return 0;
}

但是当我尝试将矢量调整为1,000,000,000时,v.resize(1000000000);程序停止执行。当它看起来应该能够时,如何让程序分配所需的内存?

我在Windows 7中使用MinGW。我有2 GB RAM。应该不可能吗? 如果不可能,我不能将它声明为整数数组并逃脱?即便这样也行不通。

另一件事是,假设我会使用一个文件(可以轻松处理这么多数据)。 我怎样才能让它在同一时间读写。 首先,使用fstream file("file.txt', ios::out | ios::in );不会创建文件。但假设文件存在,我无法同时进行读写操作。 我的意思是: 让文件的内容为111111 如果我跑: -

#include <fstream>
#include <iostream>
using namespace std;
int main()
{
  fstream file("file.txt",ios:in|ios::out);
  char x;
  while( file>>x)
  {
    file<<'0';
  }
 return 0;
}

该文件的内容现在不应该是101010吗?读一个字符,然后用0覆盖下一个字符?或者将整个内容立即读入某个缓冲区,文件中是否至少有一个0? 1111110? 但内容保持不变。请解释。 谢谢。

5 个答案:

答案 0 :(得分:14)

  1. 32位进程一次只能处理4GB的地址空间。通常,这4GB的大量地址空间用于映射其他内容。您的向量将占用太多连续的地址空间(40亿字节),这可能不可用。

  2. 你应该memory map the file。请参阅mmap

答案 1 :(得分:1)

STL实施将应对的最大值是一回事;操作系统可用的最大内存量是其他内容;你打击了后者。

例如,您可以创建多个char元素的向量。无论哪种方式,不要指望起泡性能,除非你身体上有那么多内存(加上操作系统和其他任何运行需要的东西);访问这样一个向量无疑会导致磁盘抖动,因为系统会将内存从磁盘进出内存。

另外,具有32位地址空间的处理器(或者无论物理地址空间如何运行32位操作系统)都只能处理4Gb(物理或虚拟),因此存在架构限制。而且一些操作系统限制了用户空间;例如,Win32中的用户空间固定为2Gb。各种版本的Win64人为限制用户空间以允许Microsoft收取不同的价格,因此使用Win64并不能保证足够的地址空间。

答案 2 :(得分:0)

  

然而,当我尝试通过v.resize(1000000000)将矢量调整为1,000,000,000时;程序停止执行。我该如何启用   程序分配所需的内存,当它似乎   应该能够吗?

它可能依赖于C ++ STL实现,但调整大小的行为通常会导致应用程序保留的内容远远超出您的要求。

答案 3 :(得分:0)

一个整数是四个字节,因此1,000,000,000个整数将占用大约3.72GB。

答案 4 :(得分:0)

您要求以连续的顺序分配10亿个整数。除了难以找到如此巨大的连续空间之外,你根本就没有那个空间。回想一下,公共32位系统上的整数占用32位或4个字节。乘以10亿,你远远超过2GB。此外,std::vector可以保留超过您要求的数量。

关于第二个问题,如果您同时使用相同的fstream对象进行读写,请确保在读写之前seekg()seekp()。< / p>