glibc源码目录中的sysdeps

前段时间看了下glibc的一些string库函数实现

自己照猫画虎的写了几个函数测了测, 比起windows vc中自带的实现, 并没有更快, 反倒是慢了很多.

比如memset函数, 微软公开的vc crt中memset.c是以字节为单位循环的.  如果用glibc中操作块与循环展开的方式, 按道理应该比前者快4倍/8倍才对啊

开始以为是编译器优化不给力, 后来用编译为release版, 各种手段优化用上了也比系统自带的慢很多

实在气不过, 汇编跟踪了下, 发现vc实际运行的不是memset.c的实现, 而是另一个版本, crt/src/intel/memset.s, 其中用到了rep指令…

好吧, 充分说明我看代码不认真.

我想既然crt中都有针对具体处理器的函数实现, glibc中肯定也有吧

于是翻了下目录, 发现很多函数在sysdeps目录有重复的实现版本.

顾名思义, sysdeps目录大概就是存放和处理器具体架构有关的代码

看子目录名也知道了, i386, powerpc, s390, sparc, x86, x86_64….

那么对于同一个函数, 比如memset, 就会有多个实现版本

glibc/string/memset.c

glibc/sysdeps/i386/memset.c

glibc/sysdeps/x86_64/memset.s

我的理解是外层目录的代码是通用实现, 针对各个处理器都能良好工作的

而对于可以使用处理器提供的各种高级指令进行优化的函数, 就放到sysdesp目录中再实现一个版本

 

另外还发现math库函数的真正实现貌似都在sysdeps中, glibc/math/中的c代码都没有真正的实现过一个函数…

有空再分析