首页 > 解决方案 > C++ 无法处理大型布尔数组

问题描述

我正在编写一个函数,该函数需要我将文件转换为 0 和 1 的数组。我认为这是使用bool数组最容易完成的。但是,对于大于 ~1MB 的文件,以下代码会失败并崩溃。我的机器有 8GB RAM,所以我看不出崩溃的原因。

string file_name;
cin >> file_name;
string text = read_file(file_name); //I have defined this function as returning a string containing the file's contents and it works fine when tested separately
int length = text.size();
bool bin_arr[8*length]; //to store 0s and 1s

初始化bin_arr失败,程序直接退出。

我将处理大于 1GB 左右的文件。但是,我不知道为什么会这样。我对 C++ 相当陌生。

如果相关,我在 Windows 10 上,使用 GCC 版本 6.3.0。

标签: c++

解决方案


我正在编写一个函数,该函数需要我将文件转换为 0 和 1 的数组。我认为这是使用 bool 数组最容易完成的。

我不知道你为什么这么想,最简单的方法是将文件存储为字节,就像文件包含的那样。vector<bool>这样做,例如,它不会像您的代码那样将每个位存储在单个字节中,因此内存效率提高了 8 倍。

要获得单个位,请使用上述方法vector<bool>或使用常规位摆弄。请记住,b & (1 << bit_number)如果在您的字节中设置了该位,则返回一个非零值。

我将处理大于 1GB 左右的文件。

然后不要将整个文件存储在内存中,而是将其分成小块进行流式传输。

但是,我不知道为什么会这样。

哦,这很容易。您正试图在堆栈上不必要地分配一个不必要的巨大数组,而不是在堆上。您的堆栈有非常严格的限制,默认情况下我相信 Windows 为 1MB。


推荐阅读