什么时候应该小心使用bitset代替bool数组?

时间:2009-12-07 02:55:33

标签: c performance

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

if(activeMyObjects[i]){ // it's active so do something... }

由于我的对象的最大数量在[5,20]范围内,我想我可以用一个整数“activeMyObjects”形式的bitset替换activeMyObjects bool数组。然后我可以做以下事情:

// 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...

有时候切换到bitset实际上会降低性能吗?我正在使用的语言是c。另请注意,此代码经常被调用(频率范围为30 - 60 Hz)。

修改 另一条信息:bitsets的另一个优点是我可以很容易地判断出任何对象是否都处于活动状态。所以我可以跳过一个循环,我通过先检查if(activeMyObjects)来检查每个项目是否有效。当我使用数组时这很棘手...我的方法是有一个额外的计数器int,每当MyObject被激活时递增,并且每当MyObject被停用时递减...这样我只会检查是否(activeMyObjectsCount&gt; 0 )在循环之前我检查每一个。

5 个答案:

答案 0 :(得分:3)

根据bitset的分配频率,您可以轻松地使用bitset版本占用 more 内存。

访问特定位的代码比访问整个内存字节的代码要大得多 - 如果只有少数这些数组,但是经常访问它,你会得到一个更小的占用空间喜欢它。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

不。在一天结束时,它是一个简单的整数移位,比所有帐户的数组访问成本更低。只是要小心,将bitset转换为第三组(可能是活动的,非活动的和未定义的),或者尝试向每个条目添加数据现在都是不可能的,而不需要重构。

答案 3 :(得分:1)

如果速度比内存占用更重要(因为这是整体移动应用程序),那么您可以将掩码存储在数组中并将其作为activeMyObjects&amp;掩模[i]中。

答案 4 :(得分:1)

我被告知一些PowerPC芯片(不知道它们是否全部 - 例如this question)在进行可变长度位移时很慢,因为你正在使用{{ 1}}说明。因此,在这些芯片上,bitset似乎很可能比bool数组慢得多。

这对你来说可能不是问题,但这是一个有趣的小案例:)