strlen glibc 源码分析

 

 

主要思想: 将每次读取一个字节的字符变成每次读取4/8字节的字符串,提高效率

 

挨个判断字符是否为0,遇到0则退出,代码很简洁,也不算性能低。只是有点不足,在字长是4字节或者8字节的计算机上,每次只
读取一个字节,有些浪费计算机的能力,如果每次都读取4字节或者8字节,总的读取次数就大大减少,在读取4字节或者8字节的时
候,如果地址不在边界上,机器就要分两次才能读取完成,这样性能将会降低,弱化优化效果,所以前几个字符必须单独处理,然后
从字长 边界地址开始,每次读取4字节或者8字节。


方式:

  1、 开头的几字节单独处理

     
 2、 中间部分4字节或者8字节处理

     
  3、 若中间出现零则单独处理

 

 

 


看上去很好,但是还有一个问题,4字节或者8字节读取的时候,如何保证有全0的字节存在,因为0是用来表示字符串的结尾的。
判断连 续的几个字节中是否存在全0的字节,成了优化的关键。我们不能一个字节一个字节判断,因为优化的思想就是一次读取
多个字节,减少 总的读取次数,单独判断每一个字节的话,就失去优化的效果了。

怎么办呢,当然首先考虑位运算了。

  * 一个纯0的字节有什么特点? 很明显,每一位都是0,按位取反后每一位都是1。
  * 一个全0的字节还有什么特点? 这个字节减1,必然要从更高字节借1,借1后,该字节的最高位必然是1。

似乎有些眉目了,以4字节整数n为例,我们只要把每个字节分别减去1,如果有纯0的字节存在,必然会有借位,借位之后会在
字节最高 位留下一个1。只要判断每个字节的最高位是否存在1就可以了,然而,这里还有一个问题,就是这个4字节整数里,
某些字节本来最高 位可能就含有1,所以必须排除掉这些字节。

解决方案:

  * 将n的每一个字节分别减1,并取出最高位,得到x,如果存在借位,该字节最高位就是1
  * 将n的每一个字节按位取反并取出最高位,得到y,y中某字节最高位为1,表示它在n里是0
  * 将x和y按位与运算,若不等于0,说明n至少有1字节原本最高位不是1,后来变成1了,就是借位

若n中存在全0字节,则 x&y 一定不为0,因为借位的那个字节最高位会被置为1
若n中不存在全0字节,则不会产生借位,x&y 等于0。
x&y == (n-0x01010101) & ~n & 0x80808080

 

参考:http://topic.csdn.net/u/20091029/18/8f047493-15f8-4af5-bb8d-b5147128f79a.html

           http://simohayha.javaeye.com/blog/439059

           http://bigwhite.blogbus.com/logs/37753065.html

 

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本文通过Glibc的内存暴增问题,主要介绍了系统的内存管理问题,具体如下: 目录 1. 问题 2. 基础知识 2.1 X86平台Linux进程内存布局 2.1.1 32位模式下进程内存经典布局 2.1.2 32位模式下进程默认内存布局 2.1.3 64位模式下进程内存布局 2.2 操作系统内存分配的相关函数 2.2.1 Heap操作相关函数 2.2.2 Mmap映射区域操作相关函数 3. 概述 3.1 内存管理一般性描述 3.1.1 内存管理的方法 3.1.2 内存管理器的设计目标 3.1.3 常见C内存管理程序 3.2 Ptmalloc内存管理概述 3.2.1 简介 3.2.2 内存管理的设计假设 3.2.3 内存管理数据结构概述 3.2.4 内存分配概述 3.2.5 内存回收概述 3.2.6 配置选项概述 3.2.7 使用注意事项 4. 问题分析及解决 5. 源代码分析 5.1 边界标记法 5.2 分箱式内存管理 5.2.1 Small bins 5.2.2 Large bins 5.2.3 Unsorted bin 5.2.4 Fast bins 5.3 核心结构体分析 5.3.1 malloc_state 5.3.2 Malloc_par 5.3.3 分配区的初始化 5.4 配置选项 5.5 Ptmalloc的初始化 5.5.1 Ptmalloc未初始化时分配/释放内存 5.5.2 ptmalloc_init()函数 5.5.3 ptmalloc_lock_all(),ptmalloc_unlock_all(),ptmalloc_unlock_all2() 5.6 多分配区支持 5.6.1 Heap_info 5.6.2 获取分配区 5.6.3 Arena_get2() 5.6.4 _int_new_arena() 5.6.5 New_heap() 5.6.6 get_free_list()和reused_arena() 5.6.7 grow_heap(),shrink_heap(),delete_heap(),heap_trim() 5.7 内存分配malloc 5.7.1 public_mALLOc() 5.7.2 _int_malloc() 5.8 内存释放free 5.8.1 Public_fREe() 5.8.2 _int_free() 5.8.3 sYSTRIm()和munmap_chunk(

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值