如何知道向量的正确最大大小? max_size()?但没有

问题描述 投票:2回答:5

使用矢量时,显示“内存不足”。要修复它,我使用max_size()进行检查,然后保留或push_back。如果max_size()大于保留值,应该可以,但是不能!那么max_size()是什么意思?我在Windows 7和Visual Studio 2010中编译以下演示。我的PC有4GB RAM。当重新分配为max_size()的1/2时,它将失败。

max_size()=2^32/sizeof(CPoint3D)-1=268435455

演示中的max_size()的1/4可以。在我的真实项目中,没问题,直到1/10。

向量的最大大小在哪里,如何放大]


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

如果max_size不起作用,如何找出可为vector分配的最大元素数?

c++ stl vector
5个回答
2
投票

问题是向量尝试分配一个连续的内存块,即使当时总可用内存可能更大,该内存块在那时可能也不可用。

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


4
投票

max_size()告诉您该类的设计限制,但内存不足会将实际大小限制为较小。通常没有任何方法可以找到下限(例如,下限可能会从一瞬间变为另一瞬间,具体取决于其他程序使用了多少内存)。


4
投票

max_size()返回向量可能包含的最大元素数。也就是说,当考虑诸如使用可能存储的整数类型的寻址限制以及操作系统的地址空间限制之类的绝对限制时。

这并不意味着您实际上可以使向量容纳这么多元素。这仅意味着您永远无法存储更多内容。同样,仅因为您拥有4 GB的RAM并不意味着您实际上可以创建一个占用4 GB RAM或任何附近空间的连续缓冲区。还有其他一些因素需要考虑,例如内存碎片(由于此原因,您可能只能将一个gig内存块分页到物理内存中)。

如果您确实在容器中需要这么多元素,那么连续的序列可能不是一个好选择。对于那么大的数据集,您可能需要一些可以逐点分页的内容,例如std :: deque。


3
投票

[vector::capacity()给出可以在向量中存储的最大元素数量,而无需重新分配,这可能会因vector::capacity()而失败。

[std::bad_alloc具有不同的含义,与vector::max_size()大致相似。

有关Windows内存管理的更多信息,请参见vector::max_size()


0
投票

感谢您的回答。我应该选择std:deque,在win32中其max_size = 4G。这是我在堆栈溢出中的第一个问题。我不熟悉。臭臭也给出了答案,但是阿米特是第一个。

© www.soinside.com 2019 - 2024. All rights reserved.