声明一个非常大的整数向量
Declaring a very large vector of ints?
有没有办法在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 的 char
、int
(或 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 架构上的测试切换的结果)
- C++ 如何比较n个排序的整数向量以找到互元素?
- 如何使用 STL 算法将整数向量转换为字符串向量?
- 使用192/256位整数求和无符号64位整数向量的点积的最快方法
- 如何将整数向量插入到键中,标准::映射的值
- 整数对的向量转化为整数向量的向量
- 如何组合两个整数向量
- C++中整数向量的序列化/反序列化
- 我无法在C++中启动整数向量
- 根据偶数值对整数向量进行排序
- 从整数向量向量搜索整数向量的最佳算法
- 如何将数字转换为整数向量?
- 我需要声明一个包含整数向量的 4x4 矩阵
- 基于整数向量执行位排列的有效方法?
- 将整数向量转换为字节数组向量,然后调用每个字节数组
- 如何将整数向量转换为 2 位十六进制并按顺序添加到 c 字符串?
- 为什么从右值整数向量的元素中推导 decltype(auto) 的类型是 int&?
- 将字符串转换为整数向量
- 尝试创建随机整数向量时的OpenMPI编译器错误
- 整数向量可以创建的整数项的最大数量
- 初始化和显示整数向量时出现意外结果