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;
    }
  • 相关阅读:
    基本MVVM 和 ICommand用法举例(转)
    WPF C# 命令的运行机制
    628. Maximum Product of Three Numbers
    605. Can Place Flowers
    581. Shortest Unsorted Continuous Subarray
    152. Maximum Product Subarray
    216. Combination Sum III
    448. Find All Numbers Disappeared in an Array
    268. Missing Number
    414. Third Maximum Number
  • 原文地址:https://www.cnblogs.com/vincently/p/4889849.html
Copyright © 2011-2022 走看看