我需要存储大约10000个变量的布尔信息。一开始我想使用bool数组arr[10000],但它占用了40000字节。但我需要以内存有效的方式存储这些信息。也许可以使用位运算?另外,我还需要全局存储并动态分配内存。你能帮我解决这个问题吗?
我需要存储大约10000个变量的布尔信息。一开始我想使用bool数组arr[10000],但它占用了40000字节。但我需要以内存有效的方式存储这些信息。也许可以使用位运算?另外,我还需要全局存储并动态分配内存。你能帮我解决这个问题吗?
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));
std::bitset<10000>
来存储具有固定大小的单个位,或者使用std::vector<bool>
如果需要动态更改大小。这两种方法都将每个值使用一个位。显然,最有效的方法之一是将一个值存储为一个位,这将节省8倍的内存。
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!
使用std::vector<bool>
应该是最简单的方法。您可以使用众所周知的向量接口(它带有动态分配,例如通过使用push_back
添加项目),而我所知道的所有stl实现(我不确定是否也需要定义)都使用模板特化来实现布尔向量,并将其实现为每个值1位。
请注意,动态重新分配(您不必担心它,这全部由向量类完成)将允许插入恒定摊销时间,但可能会有一些内存开销(某些比特数的一小部分),以允许此操作。特别是,每当需要时,调整大小将通过当前长度的一小部分扩展/缩小分配的内存。
虽然这不是在每次存储信息时所需的最小内存,但我仍然认为这是一种内存高效的方式。