Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;无法处理大型布尔数组_C++ - Fatal编程技术网

C++ C++;无法处理大型布尔数组

C++ C++;无法处理大型布尔数组,c++,C++,我正在编写一个函数,要求我将文件转换为0和1的数组。我认为这是使用bool数组最容易实现的。但是,对于大于~1MB的文件,以下代码会失败并崩溃。我的机器有8GB内存,所以我看不出崩溃的原因 字符串文件\u名称; cin>>文件名; 字符串文本=读取文件(文件名)//我将此函数定义为返回一个包含文件内容的字符串,单独测试时效果良好 int length=text.size(); bool bin_arr[8*长度]//存储0和1的步骤 bin_arr初始化失败,程序简单退出 我将处理大于1GB左

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

字符串文件\u名称;
cin>>文件名;
字符串文本=读取文件(文件名)//我将此函数定义为返回一个包含文件内容的字符串,单独测试时效果良好
int length=text.size();
bool bin_arr[8*长度]//存储0和1的步骤
bin_arr
初始化失败,程序简单退出

我将处理大于1GB左右的文件。然而,我不知道为什么会发生这种情况。我对C++是相当新的。
如果相关,我在Windows 10上,使用GCC版本6.3.0。

可变长度数组,如
bool bin_arr[8*Length]不在C++标准中,有堆栈溢出风险。你应该使用

注意,它有一个特殊的实现。为了避免这种情况,最好使用
std::vector
or

我正在编写一个函数,要求我将文件转换为0和1的数组。我认为这是使用布尔数组最容易实现的

我不知道你为什么认为,最简单的方法是将文件存储为字节,与文件包含的内容完全相同<代码>矢量
就是这样做的,例如,它不像代码那样将每一位存储在单个字节中,因此内存效率提高了8倍


要获取单个位,可以使用前面提到的
向量
,也可以使用常规位微调。记住
b&(1)首先,养成使用
gcc-pedantic errors
的习惯。这将表明您的代码无效。接下来,开始使用
std::vector
或其他容器(而不是堆栈分配的C数组)进行大型动态存储。您会遇到什么错误?是否会出现堆栈溢出?您的堆栈通常在1MB左右,因此checks out.@AyxanHaqverdili我没有得到任何错误,它只是退出。只是补充一下,8GB的RAM大小并不意味着分配的堆栈内存大小将等于8GB。分配给程序的堆栈内存受操作系统的限制(通常在几MB的范围内)在Linux的情况下,有一些方法可以增加OS分配的堆栈大小,但是最好的做法是使用堆内存来处理更大的数组,我希望G+++默认地关闭VLA接受,而不是允许它。这将迫使新C++程序员研究和使用标准C++来代替。f浪费他们的时间相信他们拥有的代码是有效的。在这种情况下,
std::vector
的专门化实际上可能是有用的。@FrançoisAndrieux我在多个地方读到过向量占用太多内存且效率低下,在这种特殊情况下,
std::vector
比数组好吗?@Sid
std::vector
通常是最有效的。如果你需要一个不会调整大小的动态数组,你可以节省几个字节,如果你在编译时知道数组的大小,你可以用
std::array
再节省一些。但通常不认为它是低效的。你应该随时使用它r您需要一个动态大小的数组。@Sid
std::vector
标准要求其实现方式不同于任何其他
std::vector
,以便
CHAR\u BIT
(每字节位)
bool
元素可以在每个
CHAR
(字节)中表示`为元素分配的存储空间。它将
bool
s压缩到每个位。但是,为了实现这一点,必须放弃许多有用的重要特性。例如,在
std::vector
中,您无法获得指向特定
bool
元素的指针或引用。在几乎所有情况下,这种折衷都是不值得的。但是在你的特定情况下,它可能是有用的。我印象中,布尔值只使用1位,它不是0/1值吗?@ SID,用C++来测量C++中的对象的大小,最小的对象可以是C++中的1字节,至少是8位。所以<代码>布尔O/COD>通常(至少)8位宽。