The C Programming Language

本文详细解读了glibc中strcpy函数的实现细节,包括其效率问题在特定CPU上的表现,以及与C/C++字符串处理的相关区别。通过分析不同环境下函数的表现,提出在实际应用中选择合适实现代码的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 宏定义中:do{}while(0)

2. i++与++i

3. static

4. extern

5. set -e

6. Makefile

%.d: %.c
    @set -e; rm -f $@; \
    $(CC) -M $(CPPFLAGS) $< > $@.$$$$; \
    sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
    rm -f $@.$$$$

7. glibc中strcpy

char *strcpy(char *dest,const char *src)  
{  
  char c;  
  char *s = (char *) src;  
  const ptrdiff_t off = dest - s - 1;  
  do  
    {  
      c = *s++;  
      s[off] = c;  
    }  
  while (c != '\0');  
  return dest;  
}

网上分析(http://blog.chinaunix.net/uid-23629988-id-2740802.html):

1. glibc这个strcpy的效率在Intel的某些CPU上确实效率不高——我测试了(Intel(R) Pentium(R) 4和Pentium(R) Dual-Core CPU E5300。有兴趣的朋友可以在其它CPU上测试一下,最好不是Intel的;

2. 一般glibc会根据不同的CPU实现不同版本的库函数,如strcpy。当然,我之前也知道这一点,不过我并没有去特意的看特定CPU的strcpy的 代码。而是看这个generic的代码——当时我认为generic的strcpy仍然会高效。那么实际上对于intel的CPU来说,有特定的 strcpy实现代码。所以在intel的CPU上,glibc的strcpy肯定会高效。

最好的答案就是glibc中的generic的实现代码,并不一定会高效。如果真的要学习且实现代码,看来还是要学习该CPU上的特定的实现代码。

8. string.h

C的字符串头文件是<string.h>,在C++里这个文件变成了<cstring>,string前面的c表示这个是c语言的;而C++的字符串头文件是<string>,是利用的模板实现的,跟原先C的实现方法不一样,但要安全得多。

VC++中有<string.h>文件,它就是C中的那个;
而<cstring>文件实际上只是在一个命名空间std中include了<string.h>,这是因为C++要减少名称污染;
所以两个都是可以用的,但C++鼓励用<cstring>。

<string>为字符串实现了一个类,而其实是依靠模板做的,这个可以先不考虑。使用类,可以将问题局部化,类似于把一个大问题分解成一个个小问题;而且类是具有类型安全的。
所以最好最好用C++的类。

转载于:https://my.oschina.net/u/2243185/blog/338044

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值