我对c ++中使用的向量有疑问。我知道不像数组,矢量没有限制。我有一个600万个顶点的图形,我正在使用类的向量。当我试图将节点插入向量时,它会因为错误的内存分配而失败。因为它完美地工作超过200万个节点。我知道错误的分配意味着由于我在我的代码中使用的指针而失败,但对我而言似乎并非如此。我的问题是由于图形的大尺寸而导致失败,因为矢量的限制增加了。如果有,我们可以通过任何方式增加限制。
答案 0 :(得分:3)
首先,您应该验证单个元素需要多少内存。一个顶点/节点的大小是多少? (您可以使用sizeof
运算符验证)。考虑一下,如果答案是50个字节,则需要50个字节乘以600万个顶点= 300 MBytes。
然后,考虑下一个问题:在向量中,内存必须是连续的。这意味着您的程序将要求操作系统为其提供300 MB的连续块,并且即使可用内存超过300 MB,也无法保证此块可用。您可能必须拆分数据,或选择另一个不连续的容器。 RAM碎片无法控制,这意味着如果你运行你的程序并且它可以运行,也许你再次运行它并且它不起作用(反之亦然)。
另一种可能的方法是手动调整矢量大小,而不是让它自动选择新的大小。该向量试图预测未来的某些增长,因此如果它必须增长,它将尝试分配比所需更多的容量。这个额外的容量可能是拥有足够内存和没有内存之间的差异。您可以使用std::vector::reserve
,但我认为确切的行为取决于实现 - 它可能仍然决定保留超过您请求的金额。
您还有一个选择是优化您正在使用的数据类型。例如,如果在顶点类中使用32位整数而您只需要16位,则可以使用int16_t
,这将占用一半的空间。请参阅CPP Reference处的固定大小变量的完整列表。
答案 1 :(得分:1)
您可以使用std::vector::max_size
查看您声明的向量可能容纳的最大元素数。
返回最大尺寸
返回最大元素数 矢量可以容纳。
这是容器可以达到的最大潜在尺寸 已知系统或库实施限制,但容器 绝不保证能够达到那个尺寸:它仍然可以 在达到该大小之前,无法在任何时刻分配存储空间。