C++ 关于向量初始化的几个问题

C++ 关于向量初始化的几个问题,c++,vector,stl,C++,Vector,Stl,我可以用10^8初始化向量,但不能用10^9初始化。为什么 vector<int> bucket; bucket.resize(100000000); √ bucket.resize(1000000000); × 矢量桶; bucket.resize(100000000);√ bucket.resize(100000000);× C++向量在连续块中分配内存,当块大小过大时,操作系统可能找不到这样的块 您收到的错误消息是否表示内存不足 要点是:即使您认为

我可以用10^8初始化向量,但不能用10^9初始化。为什么

 vector<int> bucket;
 bucket.resize(100000000);      √ 
 bucket.resize(1000000000);     ×
矢量桶;
bucket.resize(100000000);√ 
bucket.resize(100000000);×

C++向量在连续块中分配内存,当块大小过大时,操作系统可能找不到这样的块

您收到的错误消息是否表示内存不足


要点是:即使您认为系统上有足够的内存,如果您的程序的地址空间不能在一个块中容纳大的块,那么您就不能构造大的向量(32位和64位程序的最大地址空间大小可能不同).

这是因为resize函数将应用堆中的内存。如您所知,在第二次调整大小操作中,大小将为4000000000字节,大于系统可以分配的空间(可能是您的计算机无法为您找到一块连续空间),并将导致异常和故障

您可以申请的最大内存取决于以下许多原因:

  • 物理内存的硬件限制
  • 操作系统位(32或64)
  • 留给用户的内存。操作系统首先应该满足内核的需求。一般来说,windows内核需要比linux或unix更多的内存

  • 总之,很难知道您可以使用的准确内存大小,因为它是一个动态值。但是你可以通过新操作符

    让一个测试程序打印
    std::numeric\u limits::max()
    并检查大小来进行粗略估计。你得到的错误消息应该会告诉你什么是错误的
    sizeof(int)
    可能至少是4。100000000的向量需要4000000000字节。这比4GB小一点。它可以在64位平台上工作(操作系统中有足够的可用内存)。在32位平台上,我不太确定。顺便说一句,你在哪一个网站上?(平台-编译器,您甚至可以在某些64位操作系统上编译和运行32位应用程序。)操作系统是windows 64位,@skratchi.at
    vector
    始终在一个大的块中分配。是的,很抱歉我的错误。3有人怎么会知道,一个系统不能分配那么多?@skratchi.at YaleCheung搞定了。这很难。你可以有成吨的可用内存,但由于碎片化,没有一块4000000000连续字节。除非你问,否则你不会知道。我认为这是合理的。我没有收到错误消息,只是系统无法成功运行。