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)