使用动态分配为大约10000个变量存储布尔信息的内存有效方法

时间:2012-09-27 08:41:01

标签: c++ c memory-management

我需要存储大约10000个变量的布尔信息。首先我想到使用bool数组arr [10000],但需要40000个字节。但我需要以有效的内存方式存储这些信息。也许使用位操作?还需要另外一件事我需要全局存储它并动态分配它。你能帮帮我吗?

6 个答案:

答案 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 compressionBDDs的内容,它们更高效但实现起来更复杂,并且再次进行不同的运行时/内存权衡。

答案 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。

请注意,动态重新分配(您不必关心它,它完全由向量类完成)将允许插入的常量摊销时间,但可能有内存开销(实际数量的一小部分)比特)允许这个。特别是,只要需要,调整大小就会将分配的内存扩展/缩小当前长度的一小部分。

虽然这不是每次都存储信息的最小内存,但我仍然会以内存效率的方式使它变得更加简洁。