c++中向量的限制

Posted

技术标签:

【中文标题】c++中向量的限制【英文标题】:Limit on vectors in c++ 【发布时间】:2015-08-31 17:05:51 【问题描述】:

我有一个关于 c++ 中使用的向量的问题。我知道与数组不同,向量没有限制。我有一个包含 600 万个顶点的图,我正在使用类向量。当我试图将节点插入向量时,它会因为内存分配错误而失败。因为它在超过 200 万个节点上完美运行。我知道分配错误意味着由于我在代码中使用的指针而失败,但对我来说这似乎并非如此。我的问题是,随着矢量限制的增加,它可能由于图形的大尺寸而失败。如果是的话,我们有什么办法可以增加这个限制。

【问题讨论】:

使用 64 位系统和 64 位编译器,您的限制实际上会消失。当然,如果您尝试使用比系统中安装的内存更多的内存,速度会大大降低。 您能否向我们展示您用于向向量添加项目的代码,尤其是引发异常的部分? 检查std::vector::max_size() @user3022426,“我知道与数组不同,向量没有限制”,因为向量是元素的连续序列,很难连续分配大量数量我会说你的知识不正确。 @AlanStokes 解释了为什么 1.5 倍优于 2 倍:***.com/a/1100426/5987 【参考方案1】:

首先,您应该验证单个元素需要多少内存。一个顶点/节点的大小是多少? (您可以使用sizeof 运算符来验证这一点)。考虑一下,如果答案是 50 个字节,则需要 50 个字节乘以 600 万个顶点 = 300 MBytes。

然后,考虑下一个问题:在向量中,内存必须是连续的。这意味着您的程序将要求操作系统为其提供 300 MB 的连续块,即使可用内存超过 300 MB,也不能保证该块可用。您可能必须拆分数据,或选择另一个不连续的容器。 RAM 碎片是无法控制的,这意味着如果您运行程序并且它可以工作,也许您再次运行它并且它不起作用(反之亦然)。

另一种可能的方法是手动调整向量的大小,而不是让它自动选择新的大小。向量试图预测一些未来的增长,所以如果它必须增长,它将尝试分配比需要更多的容量。这种额外的容量可能是拥有足够内存和没有足够内存之间的区别。您可以为此使用std::vector::reserve,但我认为确切的行为取决于实现 - 它可能仍会决定保留超过您请求的数量。

您还有一个选择是优化您正在使用的数据类型。例如,如果在您的顶点类中使用 32 位整数,而您只需要 16 位,则可以使用 int16_t,这将占用一半空间。在CPP Reference 上查看固定大小变量的完整列表。

【讨论】:

【参考方案2】:

std::vector::max_size 可用于查看您声明的向量可能包含的最大元素数。

返回最大尺寸

返回元素的最大数量 向量可以保持。

这是容器可以达到的最大潜在大小,因为 已知的系统或库实现限制,但容器 不保证能够达到该尺寸:它仍然可以 在达到该大小之前的任何时候都无法分配存储。

【讨论】:

以上是关于c++中向量的限制的主要内容,如果未能解决你的问题,请参考以下文章

C++:遍历向量的向量

C++中向量的向量顺序

c++:向量问题的向量

C++:指向向量(及其元素)的指针是不是稳定,因为随着向量的增长,向量将在内存中迁移以适应更多元素? [复制]

如何在 C++ 中的向量结构中使用结构向量?

在 C++ 崩溃中使用向量向量进行基数排序