C++ 如何知道向量的正确最大大小?最大尺寸()?但是没有

C++ 如何知道向量的正确最大大小?最大尺寸()?但是没有,c++,stl,vector,C++,Stl,Vector,使用矢量时,“内存不足”显示。 要修复它,我使用max_size()检查,然后保留或向后推。\br> 如果max_size()大于保留值,则应该可以,但不是!那么max_size()的含义是什么? 我在Windows7和VisualStudio2010中编译了下面的演示。我的电脑有4GB内存。当reservd为max_size()的1/2时,它将失败 max_size()=2^32/sizeof(CPoint3D)-1=268435455 在演示中使用最大尺寸的1/4()就可以了。在我真正的项

使用矢量时,“内存不足”显示。
要修复它,我使用max_size()检查,然后保留或向后推。\br> 如果max_size()大于保留值,则应该可以,但不是!那么max_size()的含义是什么?
我在Windows7和VisualStudio2010中编译了下面的演示。我的电脑有4GB内存。当reservd为max_size()的1/2时,它将失败

max_size()=2^32/sizeof(CPoint3D)-1=268435455
在演示中使用最大尺寸的1/4()就可以了。在我真正的项目中,直到1/10都没问题

向量的最大大小的右边是什么,如何放大它


当我将大量元素推入
std::vector
时,出现了“内存不足”错误。为了避免错误,我首先使用
vector::max_size()
进行检查,然后使用
vector::reserve()
预先分配内存。但是,它不起作用。在演示项目中,当我保留最大大小的1/4时,会发生错误。在实际项目中,当我保留1/10时,就会发生错误。我正在运行Windows 7,并使用Visual Studio 2010进行编译。我的电脑有4GB内存


如果
max\u size
不起作用,我如何找出可以为
向量
分配的最大元素数?

max\u size()
告诉您类的设计限制,但内存不足会将实际大小限制在更小的范围内。通常没有任何方法可以找到下限值(例如,根据其他程序使用的内存量,它可能会从一个时刻变到另一个时刻)。

问题是vector试图分配一个连续的内存块,而该内存块当时可能不可用,即使总的可用内存可能要大得多

我建议使用
std::deque
,因为它不需要分配一个连续的内存块。

给出了在不重新分配的情况下可以存储在向量中的元素的最大数量,一个可能因
std::bad_alloc
而失败的元素

具有不同的含义,大致类似于
(INT\u MAX/sizeof(element))

有关Windows内存管理的详细信息,请参阅

max\u size()
返回向量可能包含的最大元素数。也就是说,当考虑到使用它可能存储的整数类型的寻址限制和操作系统的地址空间限制时,绝对限制

这并不意味着你可以让一个向量包含那么多元素。这只意味着你再也不能储存更多了。另外,仅仅因为您有4 Gig的RAM,并不意味着您实际上可以创建一个占用4 Gig RAM或任何相近内存的连续缓冲区。还有其他因素需要考虑,比如内存碎片(你可能只能把一个GIG内存块放在物理内存中)。
如果一个容器中确实需要这么多元素,那么连续序列可能不是一个好的选择。对于如此大的数据集,您可能需要一些可以按位分页的内容,如std::deque。

注意:我似乎记得Windows XP默认情况下会将进程内存限制为2GB。我使用try{}catch(…)查找结果。我发现deque的尺码可以翻倍。元素是16个字节。使用vector时,它可以达到12000000,但deque可以达到23000000。整个程序约占1.4G。我试试别的办法。谢谢。我发现在32位Windows7中,程序可以使用2GB。实际上,只能使用1.3GB+。