在Bitset中设置一次多位

问题描述 投票:0回答:1

我正在开发一个玩具文件系统,我正在使用bitset来跟踪已使用和未使用的页面。我正在使用arrayints(为了使用GCC的内置位操作。)来代表bitset。我没有使用std::bitset,因为它不适用于最终环境(嵌入式系统)。

现在根据Linux perf在测试期间分配文件需要35%的运行时间,45%的时间丢失设置位使用,

#define BIT_SET(a,b) ((a) |= (1ULL<<(b)))

在循环内。根据穿孔42%的时间在or丢失。删除有点快,但是大多数时间在and操作中丢失,以清除使用xor切换位的位没有任何区别。

基本上我想知道是否有更智能的方法可以一次设置多个位。如果用户请求10页空间只需将所有位一次性设置,但问题是空间可以跨越word边界。或者我应该注意的任何GCC / Clang教义?

c++ bit-manipulation bitset
1个回答
0
投票

您应该能够使用这样的函数一次在位集中设置多个位:

void set_mask(word_t* bitset, word_t mask, int lowbit) {
  int index= lowbit / sizeof(word_t);
  int offset = lowbit % sizeof(word_t);
  bitset[index] |= (mask << offset);
  mask >>= (sizeof(word_t) - offset);
  bitset[index+1] |= mask
}

如果掩码没有跨越边界,则第二个字是0,因此它保持不变。无条件地执行此操作可能比测试更快,以确定是否需要完成。如果测试另有说明,请在最后一行之前添加if (mask)

© www.soinside.com 2019 - 2024. All rights reserved.