【问题标题】:How do I find the max size that can be allocated to a vector in runtime?如何找到可以在运行时分配给向量的最大大小?
【发布时间】:2016-03-18 02:03:15
【问题描述】:

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

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

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

【问题讨论】:

  • 如果您使用指针和new 关键字,则向量存储在程序执行期间分配的动态内存(堆)中。此外,c++ 允许您更改数据结构的类型,例如,您可以使用在每个元素创建期间分配的内存块创建一个链表,并且操作系统会找到它可以使用的内存块,直到所有 RAM 都吐司跨度>

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


【解决方案1】:

跑步

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

int main()
{
    std::cout << std::numeric_limits<std::vector<int>::size_type>::max();
}

Here 在 Coliru 上我们得到

18446744073709551615

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

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

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

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

【讨论】:

  • 如果我确切知道要初始化多少个元素,并且它将非常非常多,足以让操作系统关注它,但此后不会改变,我应该使用向量还是双端队列?
  • @thegreatjedi 我会建议一个向量,除非你需要在恒定时间内从前面移除
猜你喜欢
  • 2012-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-29
  • 1970-01-01
  • 2019-10-23
相关资源
最近更新 更多