如何找到在运行时可以分配给向量的最大大小
How do I find the max size that can be allocated to a vector in runtime?
我正在测试在运行时将向量初始化为最大可能大小。最初,我认为(size_t)-1
给出了一个理论上的最大值,而vector::max_size()
给出了真正的运行时最大值。在遇到应用程序失败并提出这个问题后,我意识到这也是另一个理论极限。进一步研究发现:
(向量可以达到的最大大小)受操作系统可以为您分配的最大连续RAM块或向量<>的返回值的限制:max_size(),取较小值。
在向量(可能还有一般的容器)中,我如何找到这个真正的运行时最大值?我目前仍在构建我的应用程序(这是一个实践项目),所以我会接受任何合理优雅和高效的解决方案,这些解决方案可以给出准确的值或接近但安全的近似值。
运行
#include <iostream>
#include <limits>
#include <vector>
int main()
{
std::cout << std::numeric_limits<std::vector<int>::size_type>::max();
}
在Coliru我们得到
18446744073709551615
作为向量可以容纳的最大元素数。这在大多数/所有64位系统上应该是相同的。因此,如果我们使用最小的数据类型(char
),这意味着最大大小的向量将需要18446744073 GB的ram。因此,从实际意义上讲,这是目前无法实现的。这意味着向量大小的实际限制仅限于您可以获取的最大连续内存块。这意味着真正的限制取决于您检查时计算机上运行的其他东西。这也意味着你得到的值可能不再有效,因为在你分配你的值之前,另一个进程可能会消耗更多的内存。
如果你想获得向量大小的上限,你可以使用"如何获得可用内存C++/g++?"中的一个解决方案来找出可用内存?把它除以你试图存储在向量中的东西的大小。
这应该适用于所有标准的连续容器,因为它们保证将其内容存储在连续块中。对于非连续容器,最大大小取决于容器的实现,比如列表或映射中节点的大小,或者无序容器中哈希表的大小。
我不得不质疑你为什么要这么大的集装箱。大多数事情通常可以分成更小的块,在那里你不必处理达到系统可以分配的限制的问题。
- 用字符串的向量分配字符串向量
- 如何将向量分配给参考变量?
- 如何将C++向量分配给非表全局变量
- 向量分配上的 C++ 分割错误
- 如何将int分解为数字并以相同的顺序为向量分配数字
- 将向量分配给一个元素
- 将向量分配给向量向量的向量时,向量是范围的
- 带有Valgrind的C 的向量分配中的内存泄漏
- 将向量分配给另一个
- 为向量分配内存
- 为结构的整个向量分配结构的元素
- 将向量分配给结构的向量字段
- C++对象的向量:分配对象
- C++:通过从映射向量分配映射实例来填充映射的映射
- 将儿童的向量分配给祖父母的向量
- 使用 std::向量分配的类比 LOT 的指针分配慢
- C++ 向量分配问题
- 为什么向量分配会改变分配的向量
- 在C++中初始化向量时,你能给向量分配一个大的内存块吗
- 向量分配中的问题