zoukankan      html  css  js  c++  java
  • memcpy的实现

    按字节(Byte)拷贝实现的memcpy

    复制代码
     1 void *my_memcpy_byte(void *dst, const void *src, int n)
     2 {
     3     if (dst == NULL || src == NULL || n <= 0)
     4         return NULL;
     5 
     6     char * pdst = (char *)dst;
     7     char * psrc = (char *)src;
     8 
     9     if (pdst > psrc && pdst < psrc + n)
    10     {
    11         pdst = pdst + n - 1;
    12         psrc = psrc + n - 1;
    13         while (n--)
    14             *pdst-- = *psrc--;
    15     }
    16     else
    17     {
    18         while (n--)
    19             *pdst++ = *psrc++;
    20     }
    21     return dst;
    22 }
    复制代码

    在上面按字节拷贝中考虑了拷贝覆盖,连续的一段空间存放数据是从低地址到高地址进行存放。先从源地址读出数据,然后写入到目的地址空间中。目的空间的起始地址如果在源数据空间之内就会出现内存覆盖的情况。

    这种情况先从尾部拷贝,避免覆盖数据,不过这种情况也会破坏src空间数据,src前使用了const关键字,也就是空间只读,在函数内部不修改src空间数据。

    而标准库的memcpy并没有将写覆盖认为是内存拷贝,而是内存移动。memcpysrc代表一块内存空间,并用const关键字修饰,并不希望内存块被破坏。

    对于写覆盖(这里是内存块移动)标准库推荐使用memmove函数。

  • 相关阅读:
    tree
    单向链表反转
    libev使用方法
    PowerManagerService流程分析
    Android source code compile error: “Try increasing heap size with java option '-Xmx<size>'”
    解决git合并冲突问题
    python之字典
    Django----admin管理工具
    流程控制,以及字符串
    python入门
  • 原文地址:https://www.cnblogs.com/liangyc/p/11628723.html
Copyright © 2011-2022 走看看