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

时间:2015-12-12 02:52:45

标签: c++ vector initialization runtime dynamic-memory-allocation

我正在测试在运行时将矢量初始化为最大可能的大小。最初,我认为(size_t)-1给出了理论上的最大值,而vector::max_size()给出了真正的运行时最大值。在遇到应用程序失败并询问此question后,我意识到这也是另一个理论上的限制。进一步的研究出现了this

  

(向量可以达到的最大大小)受操作系统可以为您分配的最大连续RAM块数或向量<> :: max_size()的返回值所限制,以较小者为准。

在向量(通常可能是容器)中,如何找到这个真正的运行时最大值?我目前仍然在构建我的应用程序(这是一个练习项目)的中途,所以我将接受任何合理优雅和有效的解决方案,可以提供精确的值或接近但安全的近似。

1 个答案:

答案 0 :(得分:0)

运行

#include <iostream>
#include <limits>
#include <vector>

int main()
{
    std::cout << std::numeric_limits<std::vector<int>::size_type>::max();
}
我们得到了Coliru的

Here

18446744073709551615

作为矢量可以容纳的最大元素数。在大多数/所有64位系统上应该是相同的。因此,如果我们使用最小的数据类型(char),这意味着最大尺寸向量需要18,446,744,073 GB的RAM。因此,在实际意义上,目前这是不可能实现的。这意味着向量大小的实际限制仅限于您可以获取的最大连续内存块。这意味着真正的限制取决于您检查时计算机上正在运行的其他内容。这也意味着您获得的值可能不再有效,因为另一个进程在分配您的内存之前可能会占用更多内存。

如果你想获得你可以拥有的矢量大小的上限,你可以使用How to get available memory C++/g++?中的一个解决方案找出可用内存,并将其除以你正在尝试的东西的大小存储在矢量中。

这应该适用于所有标准的连续容器,因为它们可以保证将其内容存储在连续的块中。对于非连续容器,max size依赖于容器的实现,类似于列表或映射中节点的大小,或者无序容器中散列表的大小。

我不得不质疑你为什么要这么大的容器。大多数事情通常可以拆分成较小的块,您无需处理限制系统可以分配的限制。