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++中向量的限制的主要内容,如果未能解决你的问题,请参考以下文章