如何找到在运行时可以分配给向量的最大大小

How do I find the max size that can be allocated to a vector in runtime?

本文关键字:向量 分配 何找 运行时      更新时间:2023-10-16

我正在测试在运行时将向量初始化为最大可能大小。最初,我认为(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++?"中的一个解决方案来找出可用内存?把它除以你试图存储在向量中的东西的大小。

这应该适用于所有标准的连续容器,因为它们保证将其内容存储在连续块中。对于非连续容器,最大大小取决于容器的实现,比如列表或映射中节点的大小,或者无序容器中哈希表的大小。

我不得不质疑你为什么要这么大的集装箱。大多数事情通常可以分成更小的块,在那里你不必处理达到系统可以分配的限制的问题。