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 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取模的结果是什么。
- 使用矩阵乘法;
- 在有限个数内,对10取模的结果一定会重复的;
- 斐波那契数的通项公式;