vector<bool>我正在尝试在 C++ 中为 50,000,000,000 个条目分配 a ;但是,程序出错了。在抛出 'std::bad_alloc' What(): std::bad_alloc 实例后调用终止(或者在在线编译器中它刚刚结束)。
我最初以为这是由于尺寸太大造成的;然而,v1.maxsize()对我来说已经超过50GB了。但令人困惑的是,当我减少条目数量时,它工作得很好。
问题:考虑到条目数小于向量的最大大小,根本原因可能是什么?
其他问题/答案表明类似的问题是由于在 32 位 cpu 上造成的;不过我有一个64位的。
#include <iostream>
#include <vector>
using namespace std;
int main()
{
long size = 50000000000;
std::vector<bool> v1;
std::cout << "max_size: " << bool(v1.max_size() > 50000000000) <<"vs" << size << "\n";
v1 = std::vector<bool>(size,false);
cout << "vector initialised \n" << endl;
cout << v1.size() << endl;
}
Run Code Online (Sandbox Code Playgroud)
注意:我本质上是试图创建一个内存高效位图来跟踪不同数据结构的某些地址是否已初始化。我无法使用本文中提到的位集,因为其大小在编译时未知。
该值通常反映容器大小的理论限制,最多为 std::numeric_limits<difference_type>::max()。在运行时,容器的大小可能会被限制为比 max_size() 小的可用 RAM 量。
这意味着std::vector::max_size由于硬件限制,这并不能很好地指示您可以分配的实际最大大小。
实际上,实际的最大大小[几乎]总是更小,具体取决于运行时的可用 RAM。在当前的 64 位系统上,情况总是如此(至少对于当前可用的硬件),因为 64 位地址空间的理论大小比可用 RAM 大小大得多。