关于memcpy和memmove函数,linux的man上说的“ The memcpy() function copies n bytes from memory area src to memory area dest. The memory areas should not overlap. Use memmove() if the memory areas do overlap.”就是说memmove所复制的区域允许有重叠,相当于复制到另外一个区域,然后在复制到指定的区域的效果。如果是这样的话为什么还要用memcpy呢?因为memcpy是用汇编语言写的,速度快,而memmove不是的。下面是淘宝的一个笔试题目,填空的memove函数,顺便也把memcpy函数的用c++实现下,在实际操作系统中,memcpy函数是用汇编写的。
#include <iostream>
#include <assert.h>
using namespace std;
void *Memmove(void *str1, const void *str2, size_t n)
{
char *pStr1 = (char *)str1;
const char *pStr2 = (const char *)str2;
if(pStr1 - pStr2 >= n)
{
for(size_t i=0; i!=n; ++i)
*(pStr1++) = *(pStr2++);
}
else
{
pStr1 += n-1;
pStr2 += n-1;
for(size_t i=0; i!=n; ++i)
*(pStr1--) = *(pStr2--);
}
return str1;
}
void *Memcpy(void *dest, const void *src, size_t n)
{
assert(dest != NULL && src != NULL);
char *pStr1 = (char *)dest;
const char *pStr2 = (const char *)src;
while(n-- > 0)
*(pStr1++) = *(pStr2++);
return dest;
}
int main()
{
char a[] = "01234567890123";
char *b = a;
char *c = a+5;
Memmove(c,b,8);
//Memcpy(c, b, 8);
cout<<a<<endl;
}
关于ALIGN函数,为c中的对齐函数,ALIGN(P, ALIGNBYTES) ,P为要对齐的地址,ALIGNBYTES为对齐的字节数(一般为2的N次方)。
#define ALIGN(P, ALIGNBYTES) ((void*)( ((unsigned long)P + ALIGNBYTES -1)&~(ALIGNBYTES-1) ) )
宏定义中的括号一定要注意,多家比少加好,那个位取反~的运算优先级是高于位与&的优先级的。