Mymemcpy

     Mymemcpy这个函数实现了数组、字符串等等的内存拷贝,解决了内存重叠、拷贝速度的问题,这里值得注意的是为了实现拷贝速率的提升,要考虑字节对齐问题,这样想,如果考虑操作系统字长对齐(应用程序相对于操作系统), 那么在32位操作系统上,可以4个字节4个字节地考虑,在64位操作系统上,可以8个字节8个字节地拷贝。

      在这里补充一点额外的思考成果:在32位系统时,它的寻址恰好是4个字节,而在64位操作系统上,它的寻址是8个字节。在这里要注意,int 类型在16位操作系统是16位,也就是两个字节,在32位操作系统下是32位,也就是4个字节,在64位操作系统为什么int还是4个字节呢?这是因为人们已经习惯了。

(1)16位平台   


char         1个字节8位  


short        2个字节16位  


int             2个字节16位  


long         4个字节32位  


指针         2个字节16位   


(2)32位平台   


char         1个字节8位  


short        2个字节16位  


int             4个字节32位  


long         4个字节32位 


long long    8个字节64位   


指针         4个字节32位   


(3)64位平台   


char     1个字节  


short     2个字节 


 int                 4个字节   


long             8个字节(区别)  


long long    8个字节   


指针             8个字节(区别) 


     在此留点疑惑:cache   还有小内存拷贝方案,大内存拷贝方案。


#include<stdio.h>

#include<stdlib.h>
#include<assert.h>
#include<string.h>


void *Mymemcpy(void *dest, const void *src, int count)


{


    void *ptr = dest;

    /*char *p1 = (char *)dest;
char *p2 = (char *)src;*/
int count1 = count/sizeof(dest);//int *
int count2 = count%sizeof(dest);//char *
//printf("%d %d\n",count1,count2);
if(count1>0)
{
int *p1 = (int *)dest;
int *p2 = (int *)src;



if(dest>src && count<p1-p2)//如果源在目标之前(dest>src)并且所要拷的字节数小于两指针的间距
{
while(count1>0)
{
    *p1++ = *p2++;

    count1--;  
}
p1--;
}
else//内存重叠问题,如果源在目标之前并且所要拷的字节数大于两指针的间距;如果源在目标之后,则不存在内存重叠问题(++拷贝)
{
int *p3 = (int *)dest+count/sizeof(dest)-1;
    int *p4 = (int *)src+count/sizeof(dest)-1;
while(count1>0)
{
*p3-- = *p4--;
  count1--;
}
p3++;
}
}


if(count2>0)
{
char *p1 = (char *)dest;
char *p2 = (char *)src;



if(dest>src && count<p1-p2)//不重叠
{
while(count2>0)
{
    *p1++ = *p2++;

    count2--;
}
p1--;
}
else//内存重叠问题
{
p1 = (char *)dest+count-1;
    p2 = (char *)src+count-1;
while(count2>0)
{
*p1-- = *p2--;
count2--;
}
p1++;
}
}


return ptr;


}


int main()
{

char src[] = "abcdefgh";
char des[] = "111111";
char src1[] = "abcde";

char des1[] = "111111";

char src2[] = "abcdefgh";

int arr[] = {1,2,3,4,5,6,7,8,9};
int brr[] = {1,2,3,4};
int crr[] = {4,4,4,4,4,4};

printf("%s\n",Mymemcpy(&src[0],&src[3],2*sizeof(char)));//源在目标之后

printf("%s\n",Mymemcpy(&src2[3],&src2[0],4*sizeof(char)));//源在目标之前

Mymemcpy(&arr[0],&arr[3],2*sizeof(int));
Mymemcpy(crr,brr,2*sizeof(int));
int i = 0;
for(i = 0;i<9;i++)
{
      printf("%d ",arr[i]);
}
printf("\n");
printf("%s\n",Mymemcpy(des1,src1,1*sizeof(char)));
for(i = 0;i<6;i++)
{
printf("%d ",crr[i]);
}
printf("\n");

return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@所谓伊人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值