glibc中strcpy,strcat,strcmp,memcpy等函数的实现和分析

本文详细分析了glibc中strcpy, strcat, strcmp和memcpy等函数的源代码,展示了其在内存管理和优化方面的策略。如strcpy利用进程平坦的内存模型提高效率,memcpy通过不同平台的优化技术提升拷贝速度,包括x86平台的字节块拷贝优化。同时,文章还介绍了strcmp函数的比较逻辑。" 3712526,163065,QT开发环境搭建与Hello World程序,"['QT开发', 'C++', 'Windows开发', '编译环境', 'GUI']
摘要由CSDN通过智能技术生成

http://www.oschina.net/code/explore/glibc-2.9/string/memcpy.c 可以找到所有glibc的源代码


strcpy

源码

char *
strcpy (dest, src)
char *dest;
const char *src;
{
    reg_char c;
    char *__unbounded s = (char *__unbounded) CHECK_BOUNDS_LOW (src);//用来检测src是否合法的宏,看地址是否大于最低有效内存地址
    const ptrdiff_t off = CHECK_BOUNDS_LOW (dest) - s - 1;//求出src和dest的距离,用于后面的赋值。注意-1
    size_t n;
 
    do
    {
        c = *s++;//第一次到此处,s == dest, off == dest - s - 1,   
        s[off] = c; //第一次到此处,s == dest + 1 , s[off] == dest; 
                 //此算法利用了进程平坦的内存模型,虚拟内存平坦铺开,于是任意两个指针的差就是二者之间的距离得到地址的相对距离off就不用绝对地址来寻址了,这                 //样在循环中可以少一次dest++操作,而多出来的相对地址定位操作则完全可以用寄存器高效完成
    }
    while (c != '\0');
 
    n = s - src;
    (void) CHECK_BOUNDS_HIGH (src + n);//用来检测src+n是否合法的宏,看地址是否小于最高有效地址
    (void) CHECK_BOUNDS_HIGH (dest + n);
 
    return dest;
}


memcpy

网上对于memcpy的实现讲的有很多,找个比较靠谱的贴到这里,整体代码很漂亮,不过其中用到的DSP优化的while循环展开,其实有点小聪明了,是否可以通过int类型,在32位的CPU上做一个int类的赋值应该比4个字节复制快。

void * memcpy(void * sdt, const void * src, unsigned int len)
{
    register char * d;
    register char * s;
    if (0 == len)
    {
        return dst;
    }
    if (dst > src)

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值