如何知道向量的正确最大大小?最大尺寸()?但不是

Posted

技术标签:

【中文标题】如何知道向量的正确最大大小?最大尺寸()?但不是【英文标题】:How to know the right max size of vector? max_size()? but no 【发布时间】:2012-03-26 05:24:19 【问题描述】:

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

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

demo 中 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 分配的最大元素数?

【问题讨论】:

【参考方案1】:

max_size() 告诉你类的设计限制,但内存不足会将实际大小限制为更小。但是,通常没有任何方法可以找到下限可能是多少(例如,它可能会随着时间的推移而变化,具体取决于其他程序使用了多少内存)。

【讨论】:

【参考方案2】:

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

这并不意味着您实际上可以使向量包含那么多元素。这只是意味着您永远无法存储更多。同样,仅仅因为您有 4 gigs 的 RAM 并不意味着您实际上可以创建一个占用 4 gigs RAM 或任何接近的地方的单个连续缓冲区。还有其他因素需要考虑,例如内存碎片(由于它,您可能只能将 1 gig 内存块分页到物理内存中)。

如果你真的需要一个容器中的这么多元素,连续的序列可能不是一个好的选择。对于这么大的数据集,你可能需要一些可以分页的东西,比如 std::deque。

【讨论】:

注意:我好像记得 Windows XP 默认情况下会将进程限制为 2GB 内存。 我使用 try catch(...) 来查找结果。我发现双端队列可以得到双倍大小。该元素为 16 个字节。使用vector时可以达到12,000,000,而deque可以达到23,000,000。总程序占用约1.4G。我会尝试其他方式。【参考方案3】:

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

vector::max_size()有不同的含义,大致类似于(INT_MAX / sizeof(element))

有关 Windows 内存管理的更多信息,请参阅MSDN article

【讨论】:

谢谢。我发现在 32 位 windows 7 中,程序可以使用 2GB。实际上,只能使用 1.3GB+。【参考方案4】:

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

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

【讨论】:

以上是关于如何知道向量的正确最大大小?最大尺寸()?但不是的主要内容,如果未能解决你的问题,请参考以下文章

mediaelement.js - 具有固定最大尺寸的响应式视频

最大化 UITabBarItem 图像的大小

如何确定 ANSI 端子的尺寸?

在 React 本机应用程序中设置文本的最大大小

获取我的主屏幕小部件的大小

固定大小的 std::vector