声明一个非常大的整数向量

Declaring a very large vector of ints?

本文关键字:整数 向量 非常 一个 声明      更新时间:2023-10-16

有没有办法在C++中做到这一点而不会在运行时崩溃?

现在我正在宣布

vector<vector<int> > myvec(veclength);

我怎样才能把vec长度调得尽可能高(正确)?即使在 10^7 时,当我应该有足够的计算机内存时,它也会崩溃。

这应该需要大约 250 MiB 的空间1(或更少,取决于架构),所以内存绝对不是这里的问题,max_size也不应该,这将是 1017≈ 264∕8+8+8)。

应该提到,我通过查看GCC的libstdc++和LLVM的libc++中std::vector的实现以及在实时系统上进行测试来证实这些计算。计算值与实际实现 1:1 对应,OP 的代码可以完美地与 veclength = 10e7 配合使用。

因此,我的结论是,真正的原因在别处。


1) 通过将每个向量的大小近似三个 64 位整数来分别表示开始指针、大小和容量,并假设空向量的默认容量为 0。实际实现可能会有所不同,但可能不会太大。

参见 std::vector::max_size

返回矢量可以容纳的最大元素数。

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

这里的问题是矢量大小限制只是给定矢量类型的常量。它不是所有向量类型的常量 - 它根据向量所持有的元素类型而变化。这是因为向量间隔开以将所有元素背靠背存储在连续内存中。因此,随着矢量元素大小的增加,最大大小会减小。

请注意,您没有声明vector<int>(其中sizeof(int)是 4 个字节),而是声明了一个vector<vector<int>>(其中 sizeof(vector<int>) 是 28 个字节 - 至少对于 GCC 4.1)。

这使得(外部)矢量的最大大小可能比您预期的要小得多。

<小时 />

下面是一个可以在本地运行的小程序,它输出给定类型的向量的最大大小:

#include <iostream>
#include <vector>
int main()
{
    std::cout << "Max elements inserted into a vector having elements of size '" 
              << sizeof( std::vector<int> ) << "' is: "
              << std::vector<std::vector<int> >().max_size() << std::endl;
}

在我的 2012 PC 上,vector<int>int大小为 4)的最大大小为 1,073,741,823 (~10^9)。vector<vector<int>>vector<int>的大小为 28)(您正在使用)报告最大大小显著减小到 153,391,689

以下是vector s 的 charint(或 32 位指针)、double(或 64 位指针)和vector<vector<int>>的各种输出:

Max elements inserted into a vector having elements of size '1'  is: 4,294,967,295
Max elements inserted into a vector having elements of size '4'  is: 1,073,741,823
Max elements inserted into a vector having elements of size '8'  is:   536,870,911
Max elements inserted into a vector having elements of size '28' is:   153,391,689
<小时 />

建议的解决方案

如果您将数据结构更改为*vector<int>vector(即矢量指针),那么您将能够存储更多元素,因为您的嵌套向量不再全部压缩到同一组连续分配的内存中。当然,这可能会产生连锁性能影响和/或改变您的各种业务逻辑,因此您可以选择采用不同的方法。

<小时 />

2023 年更新:

现在,当我运行上面的代码时,我得到:

Max elements inserted into a vector having elements of size '24' is:
                                           384,307,168,202,282,325 (~2^58 or ~10^17)

因此,虽然随着时间的推移,size<vector<int>>已经从 28> 24 减少,整体max_size也显着增长(可能是由于从 x86 -> x64 架构上的测试切换的结果)