c++ - 如何找到可以在运行时分配给 vector 的最大大小?

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

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

(maximum size a vector can reach) limited by the largest contiguous chunk of RAM your OS can allocate for you or the return value of vector<>::max_size(), whichever is smaller.



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

最佳答案

运行

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

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

Here在 Coliru 我们得到
18446744073709551615

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

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

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

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

关于c++ - 如何找到可以在运行时分配给 vector 的最大大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34235723/

相关文章:

C++ 如何动态创建二维 vector

java - 重新初始化 Java 类

c++ - 在带有 msvc2008 编译器的 Qt 中使用 afx_msg

c++ - 错误消息 : start in crt1. 10.6.o ld:未找到符号 collect2:ld 返回 1 退出状态

c++ - 在类定义中动态分配内存有什么影响?

objective-c - 如何将单例类设置为委托(delegate)?

ios - 初始化单例异步 iOS

c++ - 将 C++ 的相同功能/概念转换为序言

c++ - SFML - 尝试从 vector 绘制 Sprite 时程序崩溃

c++ - 迭代对 vector