Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 什么时候应该小心使用位集代替布尔数组?_C_Performance - Fatal编程技术网

C 什么时候应该小心使用位集代替布尔数组?

C 什么时候应该小心使用位集代替布尔数组?,c,performance,C,Performance,我正在开发一款手机应用程序,我看到了一个潜在的性能改进机会。在整个代码中,我使用bool数组来跟踪哪些对象处于活动状态。例如,我将通过执行以下操作检查第I个MyObject是否处于活动状态: if(activeMyObjects[i]){ // it's active so do something... } // check if ith object is active if(activeMyObjects & (1 << i)){ // it's active...

我正在开发一款手机应用程序,我看到了一个潜在的性能改进机会。在整个代码中,我使用bool数组来跟踪哪些对象处于活动状态。例如,我将通过执行以下操作检查第I个MyObject是否处于活动状态:

if(activeMyObjects[i]){ // it's active so do something... }
// check if ith object is active
if(activeMyObjects & (1 << i)){ // it's active... }

// activate the ith object
activeMyObjects |= (1 << i);

// reset all myObjects to inactive
activeMyObjects = 0;

// and so on...
由于我的对象的最大数量在[5,20]范围内,我想我可以用一个单整数“activeMyObjects”形式的位集替换activeMyObjects bool数组。然后我可以做以下工作:

if(activeMyObjects[i]){ // it's active so do something... }
// check if ith object is active
if(activeMyObjects & (1 << i)){ // it's active... }

// activate the ith object
activeMyObjects |= (1 << i);

// reset all myObjects to inactive
activeMyObjects = 0;

// and so on...
//检查第i个对象是否处于活动状态

如果(activeMyObjects&(1Nope)。在一天结束时,这是一个简单的整数移位,比所有帐户的数组访问成本更低。请注意将位集转换为第三个集(可能是活动的、非活动的和未定义的),或尝试向每个条目添加数据,现在不需要重构就不可能了。

在大多数平台上,您将无法获得任何性能。您将节省的是内存占用。

根据位集的分配频率,使用位集版本很容易占用更多内存


访问特定位的代码要比访问整个字节内存的代码大得多——如果这些数组只有一小部分,但经常被访问,你会得到更小的内存占用空间,保持原样。

如果速度比内存占用空间更重要(因为这是整个移动应用程序)然后,您可以将掩码存储在一个数组中,并作为ActiveMyObject&mask[i]访问它们。

我听说一些PowerPC芯片(不知道它们是否都是,例如,请参见)在处理
时,执行可变长度位移的速度很慢(1)此外,如果您有超过32个对象,则需要将位集扩展为int数组。在这种情况下,您仍然可以访问数组项,但这样可以节省空间。如果速度至关重要,则最好使用命名常量,而不是掩码数组。位集在程序开始时在堆栈上分配一次am。它们的访问频率极高。位集上的操作有:设置第I位,检查第I位是否已设置,取消设置第I位,取消设置所有位。鉴于此信息,您会建议使用数组或位集吗?您真的只需要自己测试它。我知道将开发时间投入到不确定的值中很糟糕,但是非常依赖于实现的。它真的可以走任何一条路。这取决于编译器优化、本机芯片组命令、缓存结构和CPU/缓存/数据的相对速度。如果这里有人能权威性地回答这个问题,我会非常惊讶,特别是因为你没有列出这些问题变量。如果分配一次并经常访问它们,则会使用更少的内存来保留数组。加载一个布尔值就是一条指令——而使用位集时,则需要考虑三条指令(加载、移位、掩码)。从性能角度看,您需要在目标硬件上对每个选项进行基准测试,以便了解结果。