memcpy函数

实现1:《高质量c++,c编程指南》

    void *mymemcpy(void *dst,const void *src,size_t num)
    {
        assert((dst!=NULL)&&(src!=NULL));
              //assert(des>=src+num||src>dst+num);
        byte * psrc = (byte *)src;//byte 既为unsigned char类型
        byte * pdst = (byte *)dst;
        while(num-->0)*pdst++ = *psrc++;
        return dst;
    }  

缺点:没有考虑内存重叠的情况,可以加一个断言换为:assert(des>=src+num||src>dst+num);

实现2:考虑重叠,有重叠情况也复制

    void * mymemcpy(void *dest, const void *src, size_t count)
    {
        if (dest == NULL || src == NULL)
              return NULL;
        char *pdest = static_cast <char*>(dest);
        const char *psrc  = static_cast <const char*>(psrc);
        int n = count;  

        if (pdest > psrc && pdest < psrc+count)
        {
            for (size_t i=n-1; i != -1; --i)
            {
                    pdest[i] = psrc[i];
            }
        }
        else
        {
            for (size_t i= 0; i < n; i++)
            {
                    pdest[i] = psrc[i];
            }
        }  

        return dest;
    }  

对memcpy函数的改进:

改进思想:

大部分认为memcpy是一个char到char的拷贝的循环,担心它的效率。实际上,memcpy是一个效率最高的内存拷贝函数,他不会那么傻,来做一个一个字节的内存拷贝,在地址不对齐的情况下,他是一个字节一个字节的拷,地址对齐以后,就会使用CPU字长来拷(和dma类似),32bit或64bit,还会根据cpu的类型来选择一些优化的指令来进行拷贝。总的来说,memcpy的实现是和CPU类型、操作系统、cLib相关的。毫无疑问,它是内存拷贝里效率最高的,请放心使用。

        void *mymemcpy(void *dst,const void *src,size_t num)
        {
            assert((dst!=NULL)&&(src!=NULL));
            int wordnum = num/4;//计算有多少个32位,按4字节拷贝
            int slice = num%4;//剩余的按字节拷贝
            int * pintsrc = (int *)src;
            int * pintdst = (int *)dst;
            while(wordnum--)*pintdst++ = *pintsrc++;
            while (slice--)*((char *)pintdst++) =*((char *)pintsrc++);
            return dst;
        } 

转载自:http://blog.csdn.net/xiaobo620/article/details/7488827

时间: 2024-10-13 19:19:22

memcpy函数的相关文章

memcpy函数的使用方法

c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中. 1.函数原型 void *memcpy(void *dest, const void *src, size_t n); 2.功能 从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中 3.所需头文件 C语言中使用#include <string.h>; C++中使用#include <cstring>

实现 memcpy 函数

memcpy() 的解释: void* memcpy(void* dst, const void* src, size_t n); // if copying takes place between objects that overlap, the behavior is undefined. 因此自己动手实现 memcpy()时需要考虑地址重叠的情况. 另外,标准库也提供了地址重叠时的内存拷贝函数:memmove(), memmove()把源字符串拷贝到临时buf 里,然后再从临时 buf

memcpy函数详解

函数原型: void *memcpy(void *dest,void *src, unsigned int count) { assert((dest!=NULL)&&(src!=NULL)); if(dest==src) return src; char* d=(char*)dest; char* s=(char*)src; while(count--> 0) *d++=*s++; return dest; } 这是一个memcpy的源代码,在函数里面生成临时指针,这样不会改变原始

memcpy函数用法

memcpy函数用法 .分类: VC++ VC++ mfc matlab 2011-12-01 19:17 14538人阅读 评论(0) 收藏 举报 null 原型:extern void *memcpy(void *dest, void *src, unsigned int count); 用法:#include <string.h> 功能:由src所指内存区域复制count个字节到dest所指内存区域. 说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针. 举例: //

【转】【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. 注意下面的注释,对于地址重叠的情况,

C语言中strcpy与memcpy函数实现与区别

C语言中strcpy与memcpy函数是怎么实现的又有哪些区别呢?下面就与我来简单的介绍下吧,希望大家多给点意见,欢迎评论纠正错误. 6.2 字符串与数组 字符串一般是用字符数组的方式存储,例如下面的str定义: char str[] = "123456"; 这里str是一个字符数组,它存放了一个字符串"123456",由于字符串还有一个结束符"\0",所以此数组的长度为7而不是6. 6.2.1 strcpy函数与memcpy函数 strcpy和

memcpy函数 和 memmove函数 原码

原型:extern void *memcpy(void *dest, void *src, unsigned int count); 用法:#include <string.h> 功能:由src所指内存区域复制count个字节到dest所指内存区域. 说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针. 举例: // memcpy.c #include <syslib.h> #include <string.h> main() { char *s=&

memcpy函数使用

#include<iostream> using namespace std; int main() { //memcpy函数 char d[20]; //声明数组 char *str="Hellow word"; memcpy(d,str,strlen(str)); d[strlen(str)]=0; //末尾添加0 表示该字符串结束 cout<<d; getchar(); }

memset memcpy函数

memset 函数 1.其头文件为: #include<memory> 或者#include<string> 2.原型    看清是对每个字节,不是其类型 void *memset(void *s, int ch, size_t n); 函数解释:将s中前n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s . memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法[1]  . eg:int