我需要存储大约10000个变量的布尔信息。首先我想到使用bool数组arr [10000],但需要40000个字节。但我需要以有效的内存方式存储这些信息。也许使用位操作?还需要另外一件事我需要全局存储它并动态分配它。你能帮帮我吗?
答案 0 :(得分:6)
你可以这样做:
vals = new char[(len+7)/8];
// To access
vals[i/8] & 1 << (i % 8)
// To set
vals[i/8] |= 1 << (i % 8);
// To clear
vals[i/8] &= ~(char)(1 << (i % 8));
虽然是最快的,但你应该使用任何字大小的块。所以在32位计算机上:
vals = new uint32_t[(len+31)/32];
// To access
vals[i/32] & 1 << (i % 32)
// To set
vals[i/32] |= 1 << (i % 32);
// To clear
vals[i/32] &= ~(uint32_t)(1 << (i % 32));
答案 1 :(得分:3)
在C ++中,您可以使用std::bitset<10000>
选项来存储具有固定大小的个别位,如果您需要动态更改大小,则可以选择std::vector<bool>
。这两个都将使用每个值一位。
没有太多需要手工做点小事。
答案 2 :(得分:1)
显然,最有效的方法是稍微存储一个值。这将减少8倍的记忆。
答案 3 :(得分:1)
10000是一个非常小的数字,目前的计算机有几Gb的可用内存。如果你使用每个布尔变量的“int”类型,那只占40kB,这是很小的。首先将其设为int arr[N]
,然后在进一步优化之前测试并测量性能。
从每个布尔变量int
转换为位打包格式将使您使用更少的内存,但由于您必须打包并解压缩压缩格式的数据,因此一切都会变慢。你获得了记忆,但这是一种权衡,这听起来像是一种对我来说不必要的过早优化。
您还可以使用类似RLE compression或BDDs的内容,它们更高效但实现起来更复杂,并且再次进行不同的运行时/内存权衡。
答案 4 :(得分:0)
我会创建一个位字段数组,如下所示。那个10000正好...对于动态分配只是使BoolBytes成为一个指针,使用malloc和bob是你的叔叔。
typedef struct
{
unsigned b0 :1;
unsigned b1 :1;
unsigned b2 :1;
unsigned b3 :1;
unsigned b4 :1;
unsigned b5 :1;
unsigned b6 :1;
unsigned b7 :1;
}BitField;
BitField BoolBytes[1250]; // The number of bools is OVER NINE-THOUSAAAAAAAND!
另一个“效率”问题是询问内存的8倍内存是否优于在内存中执行10000个bool的地址计算所需的额外时间。没有太大的开销,但这会比一些bool稍慢。
答案 5 :(得分:0)
使用std::vector<bool>
应该是最简单的方法。您可以使用众所周知的向量接口(带有动态分配,例如,通过使用push_back
向其添加项目),而我知道的所有stl实现(我不确定它是否也是必需的定义)对bool向量使用模板特化,并将其实现为每个值1bit。
请注意,动态重新分配(您不必关心它,它完全由向量类完成)将允许插入的常量摊销时间,但可能有内存开销(实际数量的一小部分)比特)允许这个。特别是,只要需要,调整大小就会将分配的内存扩展/缩小当前长度的一小部分。
虽然这不是每次都存储信息的最小内存,但我仍然会以内存效率的方式使它变得更加简洁。