memcpy内存拷贝及优化策略图解


一般内存拷贝与优化





代码实现


#include<iostream>

usingnamespace std;

 

//不安全的内存拷贝(当源内存地址与目标内存地址重叠时会产生错误)

void h_memcpy(void*src,void *dst,intsize){

    if (src == NULL|| dst == NULL) {

       return;

    }

    

    const char *s =(char *)src;

    char *d = (char*)dst;

    

    while (size--) {

       *d++ = *s++;

    }

}

 

//内存移动(安全的内存拷贝,措施为依据源内存地址和目的内存地址不同使用不同的拷贝顺序)

void h_memmove(void*src,void *dst,intsize){

    if (src == NULL|| dst == NULL) {

       return;

    }

    

    const char *s =(char *)src;

    char *d = (char*)dst;

 

    if (s > d) {

       while (size--) {

           *d++ = *s++;

       }

    }elseif(s < d){      // 正向反向拷贝的目的就是为了避免未移动内存被覆盖

       d = d + size -1;

       s = s +size - 1;

       while (size--) {

           *d-- = *s--;

       }

    }

    // s == d, you should do nothing!~

}

 

 

int main(intargc,const char* argv[])

{

    char s[] = "12345";

    char *p1 = s;

    char *p2 = s+2;

    printf("%s\n",p1);

    printf("%s\n",p2);

    

    h_memcpy(p1, p2, 2);

    printf("%s\n",p2);

    

    return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值