zoukankan      html  css  js  c++  java
  • 【转】【C/C++】实现memcpy函数

    本文转自:http://my.oschina.net/renhc/blog/36345

    面试中如问到memcpy的实现,那就要小心了,这里有陷阱。

    先看下标准memcpy()的解释:

    1
    2
    void *memcpy(void *dst, const void *src, size_t n);
    //If copying takes place between objects that overlap, the behavior is undefined.

    注意下面的注释,对于地址重叠的情况,该函数的行为是未定义的。

    事实上所说的陷阱也在于此,自己动手实现memcpy()时就需要考虑地址重叠的情况。

    另外,标准库也提供了地址重叠时的内存拷贝函数:memmove(),那么为什么还要考虑重写memcpy()函数呢?

    因为memmove()函数的实现效率问题,该函数把源字符串拷贝到临时buf里,然后再从临时buf里写到目的地址,增加了一次不必要的开销。

    下面给出memcpy()的实现,为了与标准库函数区分,我们实现其包裹函数:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    void *Memcpy(void *dst, const void *src, size_t size);
     
    int main(int argc, char *argv[])
    {
        char buf[100] = "abcdefghijk";
        //memcpy(buf+2, buf, 5);
        Memcpy(buf+2, buf, 5);
        printf("%s ", buf+2);
    }
     
    void *Memcpy(void *dst, const void *src, size_t size)
    {
        char *psrc;
        char *pdst;
     
        if(NULL == dst || NULL == src)
        {
            return NULL;
        }
     
        if((src < dst) && (char *)src + size > (char *)dst) // 自后向前拷贝
        {
            psrc = (char *)src + size - 1;
            pdst = (char *)dst + size - 1;
            while(size--)
            {
                *pdst-- = *psrc--;
            }
        }
        else
        {
            psrc = (char *)src;
            pdst = (char *)dst;
            while(size--)
            {
                *pdst++ = *psrc++;
            }
        }
     
        return dst;
    }
  • 相关阅读:
    三调数据库标注插件
    ionic ios 打包发布流程
    ionic ios 打包 真机测试常见问题
    使用Jquery Viewer 展示图片信息
    微信支付退款证书服务器配置
    帝国CMS站点迁移
    solr 服务器搭建(Linux版)
    ionic ios 打包
    Solr 同义词搜索
    ionic 环境搭建
  • 原文地址:https://www.cnblogs.com/vincently/p/4889849.html
Copyright © 2011-2022 走看看