C 内存效率更高的布尔数组?Arduino环境
我在Arduino环境中有一些代码,它需要x(以8为增量)布尔值,这些布尔值在某些移位寄存器代码的运行时是可操作的。因此,目前我使用的布尔数组如下:C 内存效率更高的布尔数组?Arduino环境,c,arduino,boolean,boolean-operations,C,Arduino,Boolean,Boolean Operations,我在Arduino环境中有一些代码,它需要x(以8为增量)布尔值,这些布尔值在某些移位寄存器代码的运行时是可操作的。因此,目前我使用的布尔数组如下: #define number_of_shiftRegisters 220 //num of 8 bit shift registers #define numOfRegisterPins number_of_shiftRegisters * 8 //number of booleans needed boolean registers[n
#define number_of_shiftRegisters 220 //num of 8 bit shift registers
#define numOfRegisterPins number_of_shiftRegisters * 8 //number of booleans needed
boolean registers[numOfRegisterPins]; //boolean array
但我在200(1600个布尔)左右的内存中用完了,直到我看到这一点才知道原因,尽管布尔是1位的,但它们存储在8位的数据中
正如我之前所说,需要的bool数总是以8为增量,所以我不知道这是否对我有利
是否有一种内存效率更高的方法来存储1000+个布尔值,并且仍然能够通过索引引用它们
或者。。。至少更高效的内存,不会花费更多的CPU时间来设置和迭代
我曾经考虑过一个
char
数组,然后对每个char进行位屏蔽以访问各个位。但是我不知道是否有更简单的方法,或者这是否会占用更多的CPU时间。是的,您可以很容易地使用掩蔽来解决这个问题
每个字节(无符号字符)将包含8个布尔值,要获得第i个值,您可以使用
值&(1您可以使用内存效率或计算效率,但不能同时使用这两个值
将布尔值打包到无符号字符数组中
意味着对于任何随机读取访问,您必须:
计算位所在阵列的偏移量
检索该元素
计算你感兴趣的位所在字节的偏移量
将该字节移位多次,以将该位置于最低有效位置
屏蔽除最低有效位置以外的所有位置
零/非零测试
将它们存储在单个数组元素中可将其缩减为:
检索包含您感兴趣的布尔值的元素
零/非零测试
选择一种方法而不是另一种方法取决于您的存储和性能需要如何平衡,您打算如何使用数据,以及您愿意做哪些权衡。在您的情况下,直接访问方法会使存储空间增加八倍,从而耗尽内存并导致故障,因此不需要考虑。这就意味着以额外处理为代价压缩位
如果您花费大量时间迭代集合的全部或部分,您可以使用压缩方法,通过仅在需要时检索字节并在每次查找下一位时执行单个移位和掩码来减少一些计算。立即执行此操作将是过早的选择,因此请将其保留在后面直到您发现访问实际上造成了瓶颈。首先让您的程序运行可用内存。
还请记住,Arduino中使用的微控制器不是特别复杂,也没有大的寄存器,因此打包成任何较大的东西,如无符号int
或无符号long
,可能最终都会导致效率低下。我猜您键入def“bool”作为字符,如果为真,则设置为1,如果为假,则设置为0?使用220个8位移位寄存器,如果使用位掩码,则只需要220字节来存储数据。我不明白这个问题。您可以选择不运行的程序或较慢的代码来存储位中的布尔值。选择是显而易见的。谢谢。我最终使用了字节数组,看起来是8倍它的内存效率更高。CPU占用更多,CPU时间增加约18%。谢谢。我最终使用了一个字节数组,它的内存效率看起来是原来的8倍。它的CPU占用更多,相同过程的CPU时间增加约18%。我使用逐位数学创建了一个函数来查找字节和位,然后更改所需的位值。以及另一种方法是遍历字节,然后逐个遍历位。
struct Bools
{
int b1 : 1;
int b2 : 1;
int b3 : 1;
... // up to b8
}