memmove和ALIGN函数

关于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) ) )

宏定义中的括号一定要注意,多家比少加好,那个位取反~的运算优先级是高于位与&的优先级的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值