在设计内存管理器时,经常需要根据内存的size找到对应的数组index,查表是个不错的解决办法。
假设有一个数组,数组中每个元素代表一个范围,任意给定一个数,要尽可能快得找到其对应的数组索引,有什么好的办法么?
例如,数组为范围 [0,1) [1,2) [2,4) [4,8) [8,16) [16,32) [32,64) [64,128)
索引 0 1 2 3 4 5 6 7
给定一个数37,那么由于在[32,64)范围内,故应返回索引6.通过以下程序可生成一张索引表:
#include
#define MIN_MASK 5
#define MAX_MASK 12
#define MIN_VALUE (1<
#define MAX_VALUE (1<
#define DIF_VAL (1<
#define ONELINE_MASK 4
#define ONELINE (1<
int main(void)
{
FILE* fp=fopen("data.txt","w");
fprintf(fp,"static char index_table[]={\n\t");
int idx=0,idv=1,lnc=1,i;
for(i=0;i
{
if(i>=idv)
{
idx++;idv<<=1;
}
if(lnc>ONELINE)
{
fprintf(fp,"\n\t");
lnc=1;
}
fprintf(fp,"%d, ",idx);
}
fprintf(fp,"\n};");
fclose(fp);
return 0;
}
生成如下查找表
static char index_table[]={
0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
};
~
则可通过size_to_index完成从size到index的转换int size_to_index(unsigned int
size)
{ return index_table[size >> MIN_MASK];}