C++ 通过动态分配存储大约10000个变量的布尔信息的高效内存方法

C++ 通过动态分配存储大约10000个变量的布尔信息的高效内存方法,c++,c,memory-management,C++,C,Memory Management,我需要存储大约10000个变量的布尔信息。首先我想到使用bool数组arr[10000],但它需要40000字节。但是我需要以一种高效的方式存储这些信息。也许使用位操纵?另外,我还需要全局存储它,并动态分配它。你能帮我一下吗?显然,最有效的方法是稍微存储一个值。它将占用8倍的内存。您可以执行以下操作: vals = new char[(len+7)/8]; // To access vals[i/8] & 1 << (i % 8) // To set vals[i/8] |=

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

显然,最有效的方法是稍微存储一个值。它将占用8倍的内存。

您可以执行以下操作:

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));
vals=新字符[(len+7)/8];
//访问

VAL[i/8]&110000是一个非常小的数字,当前的计算机有几Gb的可用内存。如果对每个布尔变量使用“int”类型,则只占40kB,这是很小的。首先将其设置为
int arr[N]
,然后在进一步优化之前测试并测量性能

int
per boolean变量转换为位压缩格式将减少内存使用,但一切都会变慢,因为您必须从压缩格式打包和解包数据。你获得了记忆,但这是一个权衡,这听起来像是一个过早的优化,对我来说是不必要的


也可以使用类似的东西,它们更高效,但更复杂,而且又是一个不同的运行时/内存权衡。

C++中,您可以选择<代码> STD::BITSET 存储具有固定大小的二进制位,或者<代码> STD::vector < /C> >如果您需要动态地改变大小。这两种方法都将对每个值使用一个位


没有太多的需要手工进行位处理。

我会制作一个位字段数组,如下所示。那正好是10000美元。。。对于动态分配,只需将布尔字节作为指针,就可以使用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个布尔的地址计算所增加的时间更好。开销不大,但这比布尔数组要慢一些。

使用
std::vector
应该是最简单的方法。您可以只使用众所周知的vector接口(它随动态分配而来,例如,通过使用
push_back
向其中添加项目),而我知道的所有stl实现(我不确定定义是否也需要)都使用bool vector的模板专门化,并将其实现为每值1比特

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


虽然这不是每次存储信息所需的最小内存,但我仍然希望它是一种内存高效的方式。

我应该使用什么。。我想16位整数就可以了,随便你喜欢什么都行。16位整数很好。8位或16位是内存效率最高的方式。10000正好可以被8和16整除。在32位的情况下,10000个bools将浪费16位4000字节,这意味着平均每个字节2.5个bools,而我预期的是1个或8个bools。您使用的编译器和体系结构是什么?@DenisErmolin哦,对不起,是的,bool的大小是1字节。为什么这会成为一个问题?40k在现代计算机上算不了什么。您所在的平台是否特别受限?@DenisErmolin否在c中您无法分配/释放1位存储。。谷歌关于这个你会得到更多info@JensGustedt是的,我正在开发内存约束平台B OP询问了内存效率,比如说,使用64位块处理4000个内存并不是最有效的;-)如果我使用16位整数,那么语句应该是vals=newuint32_t[(len+15)/16];对吗?@user1660982基本上,只有uint16\u t而不是uint32\u t。@32位机器4000上的MichaelCrein可以无浪费地安装。在64位机器上(即使用64位整数),您将在500个所需字节的基础上浪费4个字节。可能不会有大的不同,但我确实改变了我的语言:P@MichaelKrelin-黑客不,这是一个很好的观点,我想说的是最快的,不是最有效的(因为根据他的定义它不是最有效的)。对不起,在我写我的答案之前,忽略了你还推荐了std::vector的部分。很好的回答,真的没有必要用手做任何一点烦躁的事情!
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!