Mymemcpy

来源:互联网 发布:mac预览怎么编辑pdf 编辑:程序博客网 时间:2024/06/09 18:19

     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;
}
原创粉丝点击