代码改变世界

C入门基础知识

2012-08-02 10:22  ggzwtj  阅读(315)  评论(0编辑  收藏  举报

先看一些常用的的函数的实现:

 1 void * __cdecl memcpy (void * dst,const void * src,size_t  count)
 2 {
 3         void * ret = dst;
 4         while (count--) {
 5                 *(char *)dst = *(char *)src;
 6                 dst = (char *)dst + 1;
 7                 src = (char *)src + 1;
 8         }
 9         return(ret);
10 }

 代码不难写,但是需要考虑三种情况:


因为在拷贝的时候可能是以char为单位的,也可能是以word为单位的,所以在结果上是有一定的不确定性。
下面是用内联汇编编写的:

 1 static __always_inline void * __memcpy(void * to, const void * from, size_t n)
 2 {
 3     int d0, d1, d2;
 4     __asm__ __volatile__(
 5         "rep ; movsl\n\t"
 6         "movl %4,%%ecx\n\t"
 7         "andl $3,%%ecx\n\t"
 8 #if 1 
 9         "jz 1f\n\t"
10 #endif
11         "rep ; movsb\n\t"
12 "1:"
13         : "=&c" (d0), "=&D" (d1), "=&S" (d2)
14         : "0" (n/4), "g" (n), "1" ((long) to), "2" ((long) from)
15         : "memory");
16     return (to);
17 }

memset的代码如下,貌似没什么可争的地方:

1 void * __cdecl memset (void *dst, int val, size_t count)
2 {
3     void *start = dst;
4     while (count--) {
5         *(char *)dst = (char)val;
6         dst = (char *)dst + 1;
7     }
8     return(start);
9 }

strcpy的源码实现,从这里可以看出和memcpy的区别:

  1. 指针有效性的检查,这里可能是版本的区别?
  2. 要复制多少的字符?
  3. 入参和返回参数的不同?
1 char *strcpy(char *strDestination, const char *strSource)
2 {
3   assert(strDestination!=NULL && strSource!=NULL);
4   char *strD=strDestination;
5   while ((*strDestination++=*strSource++)!='\0')
6   return strD;
7 }

当然在不同的代码中的实现可能也是不一样的。

刚才想到一个有趣的问题:如何求出第1000个斐波拉契数对10取模的结果是什么。

  1. 使用矩阵乘法;
  2. 在有限个数内,对10取模的结果一定会重复的;
  3. 斐波那契数的通项公式;