libevent - IMPL_CTYPE_FN EVUTIL_ISSPACE 实现原理

libevent 自己撸了一套 isalpha isdigit isspace

这几个函数ctype里有哇 ,为何自己撸一套呢?

不明白。更高的性能?


其原理如下

char 取值只有 0 ~ 255  共256种可能

8个32位的整形可以完整得一一对应  32*8 = 256

于是我就在8个32位整形那里做标记,你是我就标记上

比如 islower

'a'  --> 'z'   是小写字母吧   对应的ascii值    97  -- 122

你看我来个最简单的实现版本

char lower_table[256]={0};

lower_table['a'] = 1

lower_table['b'] = 1

...

lower_table['z'] = 1

然后 lower_table[c] == 1 就表示 lower了吧。==0就是非lower

显然这样实现是完全可以的,就是浪费了点内存啊,需要256个全局char哦

那,我用位数组呢? 是不是只要8分之一的空间了~~~

于是就用8个32位整形做标记

lower_table['a'] 就不是第97个char了,而是第97位 = 32+32+32+1     {0,0,0,0x2,0,0,0,0}  注意,这里的0~31 , 0对应于1  1其实是2

lower_table['b']就不是第98个char了,而是第98位 = 32+32+32+2      {0,0,0,0x4,0,0,0,0}   0x4 二进制 (100)2

lower_table['c']就不是第99个char了,而是第99位 = 32+32+32+3      {0,0,0,0x8,0,0,0,0}   0x4 二进制 (1000)2

把它们或起来 :)   就是答案 {0,0,0,  0x7fffffe , 0,0,0,0}

EVUTIL_ISLOWER_TABLE[8] 就是这个值啦



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值