一朋友问我memcpy如何写? 初时感到愕然,C库中不是有吗? 后来才知道原来是某公司考题。查看了一下要求,呵呵,要求的已经不是原来的memcpy函数了。尝试写出,欢迎高手拍砖:
#define N 4
#pragma pack(N)
void *memcpyy(void* dest,const void* src,size_t n)
{
//判断初始指针
assert((NULL != dest)&&(NULL != src));
if (0 == n){return dest;}
if(dest == src){return dest;}
//保护原指针不动
byte *pD = (byte*)dest;
const byte *pS = (const byte*)src;
size_t i,num,residue;
// 相比源指针,目标指针在低位,此时可能发生重叠,由高位到低位逆序拷贝
if (dest>src)
{
pD += n-1; pS += n-1;
for (i=0;i<N;i++)
{
if (0 == (size_t)pD%N)
{
break;
}
*pD-- = *pS--;
}
pD -= 3;
pS -= 3;
num = (n-i)/N;
residue = (n-i)%N;
size_t *pdest = (size_t*)pD;
size_t *psrc = (size_t*)pS;
while(num--)
{
*pdest-- = *psrc-- ;
}
if (0 != residue)
{
pD = (unsigned char*)(++pdest) - 1;
pS = (const unsigned char*)(++psrc) - 1;
for (i=residue;i>0;i--)
{
*pD-- = *pS-- ;
}
}
}
// 相比源指针,目标指针在高位,此时由低位到高位顺序拷贝就可
else
{
for (i=0;i<N;i++)
{
if (0 == (size_t)pD%N)
{
break;
}
*pD++ = *pS++ ;
}
num = (n - i )/N;
residue = (n - i)%N;
size_t* pdest = (size_t*)pD;
size_t* psrc = (size_t*)pS;
while (num--)
{
*pdest++ = *psrc++ ;
}
if (0 != residue)
{
pD = (unsigned char*)pdest;
pS = (const unsigned char*)psrc;
for (i=0;i<residue;i++)
{
*pD++ = *pS++;
}
}
}
return dest;
}