您的位置:首页 > 其它

Mymemcpy

2017-10-10 18:46 141 查看
     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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息